输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开
依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开
3 5 4 2 6 7 1 2 5 3 6 4 7 1
2 6 1 3 5 2 4 6 7 1 2 5 6 1 7 4 3
/**
*1.利用层次遍历和中序遍历还原数组,我采用的是递归的方式,同时在递归的过程中判断记录叶子节点
*2.先序遍历
*3.后序遍历
*说明:中序遍历的根节点左边是左子树,右边是右子树,在层次遍历中根节点是第一个,然后把左子树的层次遍历和右子树的此次遍历提取出来进行递归
*/
import java.util.*; public class Main { public static StringBuffer sb1=new StringBuffer(); public static StringBuffer sb2=new StringBuffer(); public static StringBuffer sb3=new StringBuffer(); public static void main(String[] args){ Scanner scan=new Scanner(System.in); String str1=scan.nextLine(); String str2=scan.nextLine(); String[] s1=str1.split(" "); TreeNode root=xun(s1,str2); preOrder(root); postOrder(root); System.out.println(sb1.toString().trim()); System.out.println(sb2.toString().trim()); System.out.println(sb3.toString().trim()); } public static TreeNode xun(String[] a,String b){ if(b.length()==0) return null; int index=0; String[] s2=b.split(" "); int len=s2.length; TreeNode temp=new TreeNode(a[0]); for(;index<len;index++){ if(a[0].equals(s2[index])) break; } ArrayList<String> list1=new ArrayList(Arrays.asList(a)); ArrayList<String> list2=new ArrayList(Arrays.asList(a)); for(int i=0;i<=index;i++) list1.remove(s2[i]); for(int i=index;i<len;i++) list2.remove(s2[i]); temp.left=xun(list2.toArray(new String[list1.size()]),b.substring(0,b.indexOf(s2[index]))); if(index==len-1) temp.right=null; else temp.right=xun(list1.toArray(new String[list2.size()]),b.substring(b.indexOf(s2[index+1]))); if(temp.left==null&&temp.right==null) sb1.append(temp.val+" "); return temp; } public static void preOrder(TreeNode root){ if(root!=null){ sb2.append(root.val+" "); preOrder(root.left); preOrder(root.right); } } public static void postOrder(TreeNode root){ if(root!=null){ postOrder(root.left); postOrder(root.right); sb3.append(root.val+" "); } } } class TreeNode{ public String val; public TreeNode left; public TreeNode right; public TreeNode(String val){ this.val=val; this.left=null; this.right=null; } }
#include<iostream> #include<vector> #include<cstdio> #include<string> #include<cstring> using namespace std; struct TreeNode { int val; TreeNode *left,*right; TreeNode(int v):val(v),left(nullptr),right(nullptr){} }; TreeNode* createTree(vector<int>inorder,vector<int>seq,int begin,int end) { if(seq.size()<=0) return nullptr; TreeNode *root=new TreeNode(seq[0]); vector<int>left; vector<int>right; int k; for(k=begin;k<=end;++k) if(inorder[k]==seq[0]) break; bool isleft; for(int i=1;i<seq.size();++i) { isleft=false; for(int j=begin;j<k;++j) { if(seq[i]==inorder[j]) { isleft=true; break; } } if(isleft) left.push_back(seq[i]); else right.push_back(seq[i]); } root->left=createTree(inorder,left,begin,k-1); root->right=createTree(inorder,right,k+1,end); return root; } void preorder(TreeNode *ptr,vector<int>&pre) { if(ptr!=nullptr) { pre.push_back(ptr->val); preorder(ptr->left,pre); preorder(ptr->right,pre); } } void postorder(TreeNode *ptr,vector<int>&post) { if(ptr!=nullptr) { postorder(ptr->left,post); postorder(ptr->right,post); post.push_back(ptr->val); } } void getleafNode(TreeNode *ptr,vector<int>&leaf) { if(ptr==nullptr) return ; if(ptr!=nullptr&&ptr->left==nullptr&&ptr->right==nullptr) { leaf.push_back(ptr->val); return ; } getleafNode(ptr->left,leaf); getleafNode(ptr->right,leaf); return ; } int main() { int n; char *str=new char[100]; vector<int>inorder; vector<int>seq; cin.getline(str,100); char *temp; temp=strtok(str," "); while(temp) { sscanf(temp,"%d",&n); seq.push_back(n); temp=strtok(NULL," "); } cin.getline(str,100); temp=strtok(str," "); while(temp) { sscanf(temp,"%d",&n); inorder.push_back(n); temp=strtok(NULL," "); } TreeNode *root=createTree(inorder,seq,0,inorder.size()-1); vector<int>pre,post,leaf; preorder(root,pre); postorder(root,post); getleafNode(root,leaf); for(int i=0;i<leaf.size();++i) cout<<leaf[i]<<" "; cout<<endl; for(int i=0;i<pre.size();++i) cout<<pre[i]<<" "; cout<<endl; for(int i=0;i<post.size();++i) cout<<post[i]<<" "; cout<<endl; return 0; }
class TreeNode(object): def __init__(self, x): self.left = None self.right = None self.val = x class Solution(object): def __init__(self): self.leaf = [] def creatTree(self, bfsorder, inorder): """ 从中序遍历找出左右子树,然后再从序列层次遍历中找出左右子树序列,重建二叉树 :param bfsorder: :param inorder: :return: """ if len(bfsorder) < 1: return if len(bfsorder) == 1 and bfsorder[0] not in self.leaf: self.leaf.append(bfsorder[0]) # print(self.leaf) root = TreeNode(bfsorder[0]) root_index = inorder.index(root.val) # 根节点在中序遍历的索引 left_in = inorder[:root_index] # 中序遍历的左子树 right_in = inorder[root_index + 1:] # 中序遍历的左子树 left_bsf = [x for x in bfsorder if x in left_in] # 层次遍历的左子树、 right_bfs = [x for x in bfsorder if x in right_in] root.left = self.creatTree(left_bsf, left_in) root.right = self.creatTree(right_bfs, right_in) return root def preorder(self, root): if not root: return [] return [root.val] + self.preorder(root.left) + self.preorder(root.right) def postorder(self, root): if not root: return [] return self.postorder(root.left) + self.postorder(root.right) + [root.val] s = Solution() bfsorder = [int(x) for x in input().split()] inorder = [int(x) for x in input().split()] root = s.creatTree(bfsorder, inorder) pre = s.preorder(root) post = s.postorder(root) print(' '.join(list(map(str,s.leaf)))) print(' '.join(list(map(str,pre)))) print(' '.join(list(map(str,post))))
import java.util.*; class TreeNode { public String val; public TreeNode left; public TreeNode right; public TreeNode(String val) { this.val = val; this.left = null; this.right = null; } } public class Main { public static StringBuilder sb1 = new StringBuilder(); public static StringBuilder sb2 = new StringBuilder(); public static StringBuilder sb3 = new StringBuilder(); public static void main(String[] args) { Scanner scan = new Scanner(System.in); String[] levelTranversal = scan.nextLine().split(" "); String[] inOrderTranversal = scan.nextLine().split(" "); scan.close(); // TreeNode root = getBinaryTree(levelTranversal, inOrderTranversal); preOrder(root); lastOrder(root); // System.out.println(sb1.toString().trim()); System.out.println(sb2.toString().trim()); System.out.println(sb3.toString().trim()); } public static TreeNode getBinaryTree(String[] levelTranversal, String[] inOrderTranversal) { if (inOrderTranversal.length == 0) return null; // int index = 0; int inOrderTranversalLength = inOrderTranversal.length; TreeNode temp = new TreeNode(levelTranversal[0]); // 1. 找到这一轮的根节点 while (!levelTranversal[0].equals(inOrderTranversal[index])) { index++; } // 2. 两数组存放中序序列划分出来的左边和右边,其分别包含了原二叉树的左子树和右子树 String[] inOrderTranversalLeft = new String[index]; String[] inOrderTranversalRight = new String[inOrderTranversalLength - index - 1]; // 复制填充数据 System.arraycopy(inOrderTranversal, 0, inOrderTranversalLeft, 0, inOrderTranversalLeft.length); for (int i = 0; i < inOrderTranversalRight.length; i++) { inOrderTranversalRight[i] = inOrderTranversal[index + i + 1]; } // 3. 存放原二叉树左子树的层级序列,即中序序列划分出来的左边对应的层级序列。右边同理。 String[] levelTranversalLeft = new String[inOrderTranversalLeft.length]; String[] levelTranversalRight = new String[inOrderTranversalRight.length]; // 填充数据 int leftIndex = 0, rightIndex = 0; for (int i = 1; i < levelTranversal.length; i++) { // 是左的放左,否则就是右的,放右 if (contains(inOrderTranversalLeft, levelTranversal[i])) { levelTranversalLeft[leftIndex++] = levelTranversal[i]; }else { levelTranversalRight[rightIndex++] = levelTranversal[i]; } } // 4. 递归处理左节点和右节点 temp.left = getBinaryTree(levelTranversalLeft, inOrderTranversalLeft); temp.right = getBinaryTree(levelTranversalRight, inOrderTranversalRight); // 5. 存放叶子节点 if (temp.left == null && temp.right == null) { sb1.append(temp.val).append(" "); } return temp; } private static boolean contains(String[] arr, String key) { for (String element : arr) { if (element.equals(key)) return true; } return false; } public static void preOrder(TreeNode root) { if (root != null) { sb2.append(root.val).append(" "); preOrder(root.left); preOrder(root.right); } } public static void lastOrder(TreeNode root) { if (root != null) { lastOrder(root.left); lastOrder(root.right); sb3.append(root.val).append(" "); } } }
import java.util.*; import static java.util.Arrays.asList; import static java.util.Arrays.copyOfRange; public class Main{ static List treefinal = new ArrayList(); public static void main(String []args){ Scanner in = new Scanner(System.in); String []str1 = in.nextLine().split(" "); String []str2 = in.nextLine().split(" "); List<String> pre = Main.findpre(str1,str2); List<String> back = Main.findback2(str1,str2); System.out.print(treefinal.get(0)); for(int i = 1; i < treefinal.size(); i++){ System.out.print(" "); System.out.print(treefinal.get(i)); } System.out.println(); System.out.print(pre.get(0)); for(int i = 1; i < pre.size(); i++){ System.out.print(" "); System.out.print(pre.get(i)); } System.out.println(); System.out.print(back.get(0)); for(int i = 1; i < back.size(); i++){ System.out.print(" "); System.out.print(back.get(i)); } } public static List<String> findpre(String[] str1, String[] str2){ if(str1.length==0){ return new ArrayList<String>(); } List<String> curstr = new ArrayList<String>(asList(str1[0])); for(int i = 0; i < str2.length; i++){ if(str2[i].equals(str1[0])){ List<String> curpre1 = new ArrayList<String>(); List<String> curpre2 = new ArrayList<String>(); List<String> curin1 = asList(copyOfRange(str2,0,i)); List<String> curin2 = asList(copyOfRange(str2,i+1,str2.length)); for(int j = 1; j < str1.length; j++){ if(curin1.contains(str1[j])){ curpre1.add(str1[j]); }else{ curpre2.add(str1[j]); } } String[] test1= curpre1.toArray(new String[curpre1.size()]); String[] test2= curin1.toArray(new String[curin1.size()]); String[] test3= curpre2.toArray(new String[curpre2.size()]); String[] test4= curin2.toArray(new String[curin2.size()]); curstr.addAll(findpre(test1, test2)); if(test1.length==1){ treefinal.add(test1[0]); } curstr.addAll(findpre(test3, test4)); if(test3.length==1){ treefinal.add(test3[0]); } break; } }return curstr; } public static List<String> findback2(String[] str1, String[] str2){ if(str1.length==0){ return new ArrayList<String>(); } List<String> curstr = new ArrayList<String>(); for(int i = 0; i < str2.length; i++){ if(str2[i].equals(str1[0])){ List<String> curpre1 = new ArrayList<String>(); List<String> curpre2 = new ArrayList<String>(); List<String> curin1 = asList(copyOfRange(str2,0,i)); List<String> curin2 = asList(copyOfRange(str2,i+1,str2.length)); for(int j = 1; j < str1.length; j++){ if(curin1.contains(str1[j])){ curpre1.add(str1[j]); }else{ curpre2.add(str1[j]); } } String[] test1= curpre1.toArray(new String[curpre1.size()]); String[] test2= curin1.toArray(new String[curin1.size()]); curstr.addAll(findback2(test1, test2)); curstr.addAll(findback2(curpre2.toArray(new String[curpre2.size()]),curin2.toArray(new String[curin2.size()]))); curstr.add(str1[0]); break; } }return curstr; } }
#include<bits/stdc++.h> using namespace std; struct treeNode{ int val; treeNode*left; treeNode*right; treeNode(int x):val(x),left(nullptr),right(nullptr){} }; treeNode*reConstruct(vector<int>lay,vector<int>vin){ if(vin.size()==0)return nullptr; int temp=lay[0]; treeNode*head=new treeNode(temp); int tag=0; for(int i=0;i<vin.size();i++){ if(vin[i]==temp){ tag=i; break; } } vector<int> vinleft(vin.begin(),vin.begin()+tag); vector<int> vinright(vin.begin()+tag+1,vin.end()); vector<int>layleft,layright; for(int i=1;i<lay.size();i++){ for(int j=0;j<tag;j++){ if(lay[i]==vin[j]){ layleft.push_back(lay[i]); break; } } } for(int i=1;i<lay.size();i++){ for(int j=tag+1;j<vin.size();j++){ if(lay[i]==vin[j]){ layright.push_back(lay[i]); break; } } } head->left=reConstruct(layleft,vinleft); head->right=reConstruct(layright,vinright); return head; } void leafOrder(treeNode*head,vector<int>&leaf){ if(head==nullptr)return ; if(head->left==nullptr&&head->right==nullptr) leaf.push_back(head->val); if(head->left!=nullptr) leafOrder(head->left,leaf); if(head->right!=nullptr) leafOrder(head->right,leaf); } void preOrder(treeNode*head,vector<int>&pre){ if(head==nullptr)return ; pre.push_back(head->val); preOrder(head->left,pre); preOrder(head->right,pre); } void posOrder(treeNode*head,vector<int>&pos){ if(head==nullptr)return ; posOrder(head->left,pos); posOrder(head->right,pos); pos.push_back(head->val); } int main(){ vector<int>lay,vin,pre,leaf,pos; int a,b; while(cin>>a){ lay.push_back(a); if(cin.get()=='\n')break; } while(cin>>b){ vin.push_back(b); if(cin.get()=='\n')break; } treeNode*head=reConstruct(lay,vin); leafOrder(head,leaf); preOrder(head,pre); posOrder(head,pos); for(int i=0;i<leaf.size();i++) cout<<leaf[i]<<" "; cout<<endl; for(int i=0;i<pre.size();i++) cout<<pre[i]<<" "; cout<<endl; for(int i=0;i<pos.size();i++) cout<<pos[i]<<" "; cout<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; const int maxn = 2050; int arr[maxn]; vector<int> pre, post, leaves; struct Node{ int val; Node *left, *right; Node(int x):val(x) {left = right = NULL;} }; Node *insert(vector<int> layer, vector<int> m_order) { if(layer.size() == 0) return NULL; int idx = 0; for(idx; idx < m_order.size(); idx++) if(layer[0] == m_order[idx]) break; Node *cur = new Node(m_order[idx]); if(m_order.size() == 1) return cur; vector<int> left_layer;//左子树的层次遍历 for(int i = 1; i < layer.size(); i++) for(int j = 0; j < idx; j++) if(layer[i] == m_order[j]) left_layer.push_back(layer[i]); cur->left = insert(left_layer, vector<int>(m_order.begin(), m_order.begin()+idx)); vector<int> right_layer;//右子树的层次遍历 for(int i = 1; i < layer.size(); i++) for(int j = idx + 1; j < m_order.size(); j++) if(layer[i] == m_order[j]) right_layer.push_back(layer[i]); cur->right = insert(right_layer, vector<int>(m_order.begin()+idx+1, m_order.end())); return cur; } void pre_order(Node* head) { if(head) { if(!head->left && !head->right) leaves.push_back(head->val); pre.push_back(head->val); pre_order(head->left); pre_order(head->right); } } void post_order(Node *head) { if(head) { post_order(head->left); post_order(head->right); post.push_back(head->val); } } void print_vec(vector<int> a) { for(int i = 0; i < a.size() - 1; i++) cout<<a[i]<<" "; cout<<a[a.size()-1]<<endl; } int main() { int cnt = 0, x; while(cin>>x) arr[cnt++] = x; int n = cnt / 2; vector<int> layer(arr, arr+n); vector<int> m_order(arr+n, arr+cnt); Node* head = insert(layer, m_order); pre_order(head); post_order(head); print_vec(leaves); print_vec(pre); print_vec(post); } /* 3 5 4 2 6 7 1 2 5 3 6 4 7 1 */
#include <bits/stdc++.h> using namespace std; struct Tree{ int val; Tree *left, *right; Tree(int val):val(val), left(NULL), right(NULL){} }; Tree *Build(vector<int> level, vector<int> in, int s, int e){ if(level.empty()) return NULL; Tree *T = new Tree(level[0]); vector<int> l, r; int k=s; bool isleft; while(in[k]!=level[0]) k++; for(int i=1;i<level.size();i++){ isleft = false; for(int j=s;j<k;j++){ if(level[i]==in[j]){ isleft = true; break; } } if(isleft) l.push_back(level[i]); else r.push_back(level[i]); } T->left = Build(l, in, s, k-1); T->right = Build(r, in, k+1, e); return T; } void Leaves(Tree *T, vector<int> &leaf){ if(!T) return; if(T->left==NULL && T->right==NULL){ leaf.push_back(T->val); return; } Leaves(T->left, leaf); Leaves(T->right, leaf); } void PreOrder(Tree *T, vector<int> &pre){ if(!T) return; pre.push_back(T->val); PreOrder(T->left, pre); PreOrder(T->right, pre); } void PostOrder(Tree *T, vector<int> &post){ if(!T) return; PostOrder(T->left, post); PostOrder(T->right, post); post.push_back(T->val); } void Print(vector<int> v){ for(int i=0;i<v.size();i++){ if(i==v.size()-1) cout<<v[i]<<endl; else cout<<v[i]<<" "; } } int main(){ vector<int> a, b; int x; while(cin>>x){ a.push_back(x); if(getchar()=='\n') break; } while(cin>>x){ b.push_back(x); if(getchar()=='\n') break; } Tree *T = Build(a, b, 0, b.size()-1); vector<int> pre, post, leaf; Leaves(T, leaf); Print(leaf); PreOrder(T, pre); Print(pre); PostOrder(T, post); Print(post); return 0; }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 笔试 { class TreeNode { public int val; public TreeNode(int val) { this.val = val; } public TreeNode left; public TreeNode right; } class Program { static void Main(string[] args) { string[] input1 = Console.ReadLine().Split(' '); string[] input2 = Console.ReadLine().Split(' '); int[] seq = new int[input1.Length]; int[] tin = new int[input2.Length]; //把输入信息转换为int数组 for (int i = 0; i < seq.Length; i++) { seq[i] = int.Parse(input1[i]); } for (int i = 0; i < tin.Length; i++) { tin[i] = int.Parse(input2[i]); } TreeNode root = reConstructBinaryTree(seq, 0, seq.Length - 1, tin, 0, tin.Length - 1); FindLeft(root); foreach (var i in result) { Console.Write(i+" "); } Console.WriteLine(); PreOrder(root); Console.WriteLine(); PostOrder(root); } //存储叶子结点 static List<int> result = new List<int>(); //构建二叉树 public static TreeNode reConstructBinaryTree(int[] seq, int seqStart, int seqEnd, int[] tin, int inStart, int inEnd) { if (seqStart > seqEnd || inStart > inEnd) return null; int i=0; int j=0; //在中序数组找到第一个在层序数组中出现的结点的位置 for (i=seqStart ; i <= seqEnd; i++) { for ( j = inStart; j <=inEnd; j++) { if (seq[i] == tin[j]) { break; } } //如果找到了就break if (j <= inEnd) break; } TreeNode root = new TreeNode(seq[i]); //找到的这个结点在中序数组中,左边是该数的左子树,右边是该结点的右子树,对两边递归 root.left = reConstructBinaryTree(seq, seqStart + 1, seqEnd, tin, inStart, j - 1); root.right = reConstructBinaryTree(seq, seqStart + 1, seqEnd, tin, j + 1, inEnd); return root; } //前序遍历 public static void PreOrder(TreeNode root) { if (root == null) return; Console.Write(root.val+" "); PreOrder(root.left); PreOrder(root.right); } //后序遍历 public static void PostOrder(TreeNode root) { if (root == null) return; PostOrder(root.left); PostOrder(root.right); Console.Write(root.val + " "); } //查找叶子结点 public static void FindLeft(TreeNode root) { if (root == null) return; if (root.left == null && root.right == null) result.Add(root.val); FindLeft(root.left); FindLeft(root.right); } } }
import java.util.*; class TreeNode{ int val; TreeNode left = null; TreeNode right = null; TreeNode(int val) {this.val = val;} } public class Main{ public static void findLeaf(TreeNode root){ if (root == null) return; TreeNode p = root; ArrayList<TreeNode> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); while (!stack.isEmpty()||p != null){ if (p != null){ stack.push(p); p = p.left; } else { p = stack.pop(); if (p.right == null&&p.left == null) list.add(p); p = p.right; } } for (int i=0;i<list.size();i++) System.out.print(list.get(i).val+" "); System.out.println(); } public static void PrePrint(TreeNode root){ if (root == null) return; Stack<TreeNode> stack = new Stack<>(); TreeNode p = root; while (p != null||!stack.isEmpty()){ if (p != null){ System.out.print(p.val+" "); stack.push(p); p = p.left; } else { p = stack.pop(); p = p.right; } } System.out.println(); } public static void PostPrint(TreeNode root){ if (root == null) return; Stack<TreeNode> stack = new Stack<>(); TreeNode p = root, pL = root; while (p != null){ stack.push(p); p = p.left; } while (!stack.isEmpty()){ p = stack.pop(); if (p.right == null||pL == p.right){ System.out.print(p.val+" "); pL = p; } else { stack.push(p); p = p.right; while (p != null){ stack.push(p); p = p.left; } } } System.out.println(); } public static TreeNode reCon(int []lay, int []in){ if (lay.length == 0) return null; TreeNode root = new TreeNode(lay[0]); ArrayList<Integer> left = new ArrayList<>(); ArrayList<Integer> right = new ArrayList<>(); int head = 0; for (;head < in.length;head++) if (in[head] == lay[0]) break; boolean leftTree = false; for (int i=1;i<lay.length;i++){ leftTree = false; for (int j=0;j<head;j++) if (lay[i] == in[j]){ leftTree = true; break; } if (leftTree) left.add(lay[i]); else right.add(lay[i]); } int[] layleft = new int[left.size()]; int[] layright = new int[right.size()]; for (int i=0;i<left.size();i++) layleft[i] = left.get(i); for (int i=0;i<right.size();i++) layright[i] = right.get(i); root.left = reCon(layleft, Arrays.copyOfRange(in, 0, head)); root.right = reCon(layright, Arrays.copyOfRange(in, head+1, in.length)); return root; } public static void main(String []args){ Scanner sc = new Scanner(System.in); while (sc.hasNextLine()){ String []laystr = sc.nextLine().split(" "); String []instr = sc.nextLine().split(" "); int []lay = new int[laystr.length]; int []in = new int[instr.length]; for (int i=0;i<in.length;i++){ lay[i] = Integer.valueOf(laystr[i]); in[i] = Integer.valueOf(instr[i]); } TreeNode root = reCon(lay, in); findLeaf(root); PrePrint(root); PostPrint(root); } } }
package com.hhdd.offer.xiaohongshu; import java.util.Scanner; /** * 根据中序遍历和层次遍历重建一棵二叉树 * 中序遍历可以确定左子树和右子树的范围 * 层次遍历可以确定在一个范围的子树中的层级关系 * 故这二者的序列给定就一定可以唯一的确定一棵二叉树 */ public class RecoverBTByLeverAndInOrder { public static class TreeNode { private int val; private TreeNode left; private TreeNode right; public TreeNode(int value) { this.val = value; } } public static TreeNode recoverBT(int[] level, int[] in) { return recoverBT(level, in, 0, in.length - 1); } public static TreeNode recoverBT(int[] level, int[] in, int iStart, int iEnd) { int index = findFirstNode(level, in, iStart, iEnd); if (index == -1) { return null; } TreeNode tree = new TreeNode(in[index]); tree.left = recoverBT(level, in, iStart, index - 1); tree.right = recoverBT(level, in, index + 1, iEnd); return tree; } /** * 在给定范围的中序遍历中,寻找第一个出现在层次遍历中的节点 * 这个节点的层级一定是这个中序遍历中层级最高的 * * @param level * @param in * @return 找到返回中序遍历的下标,没找到返回-1 */ public static int findFirstNode(int[] level, int[] in, int iStart, int iEnd) { for (int i = 0; i < level.length; i++) { for (int j = iStart; j <= iEnd; j++) { if (level[i] == in[j]) { return j; } } } return -1; } /** * 前序遍历 * * @param head */ public static void preOrder(TreeNode head) { if (head == null) { return; } System.out.print(head.val + " "); preOrder(head.left); preOrder(head.right); } /** * 后序遍历 * * @param head */ public static void postOrder(TreeNode head) { if (head == null) { return; } postOrder(head.left); postOrder(head.right); System.out.print(head.val + " "); } /** * 打印叶子节点 * 通过魔改前序遍历的方式 * * @param head */ public static void printLeafNode(TreeNode head) { if (head == null) { return; } //如果当前节点的左右子树都空,则是叶子节点,打印后直接返回 if (head.left == null && head.right == null) { System.out.print(head.val + " "); return; } printLeafNode(head.left); printLeafNode(head.right); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s1 = scanner.nextLine(); String s2 = scanner.nextLine(); String[] strings1 = s1.split(" "); String[] strings2 = s2.split(" "); int[] level = new int[strings1.length]; int[] in = new int[strings2.length]; for (int i = 0; i < strings1.length; i++) { level[i] = Integer.parseInt(strings1[i]); in[i] = Integer.parseInt(strings2[i]); } TreeNode tree = recoverBT(level, in); printLeafNode(tree); System.out.println(); preOrder(tree); System.out.println(); postOrder(tree); } }
var readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); //多行输入 var inputArr = []; rl.on('line', function (input) { inputArr.push(input); if (inputArr.length === 2) { var floor = inputArr[0].split(' '); var mid = inputArr[1].split(' '); var leaves = []; function build(floor, mid) { var root = null; if (floor.length > 1) { var rootMidIdx = mid.indexOf(floor[0]); var midLeftList = mid.slice(0, rootMidIdx); var midRightList = mid.slice(rootMidIdx + 1); var floorLeftList = getSubFromFloor(floor, midLeftList); var floorRightList = getSubFromFloor(floor, midRightList); root = { val: floor[0], left: build(floorLeftList, midLeftList), right: build(floorRightList, midRightList) } } else if (floor.length === 1) { root = { val: floor[0], left: null, right: null }; leaves.push(floor[0]) } return root } var head = build(floor, mid); console.log(leaves.join(' ')); var preList = []; var lrdList = []; function pre(head) { if (head.val) { preList.push(head.val) if (head.left) { pre(head.left) } if (head.right) { pre(head.right) } } } pre(head); function lrd(head) { if (head.val) { if (head.left) { lrd(head.left) } if (head.right) { lrd(head.right) } lrdList.push(head.val) } } lrd(head); console.log(preList.join(' ')); console.log(lrdList.join(' ')); } }); function getSubFromFloor(floor, list) { var ans = []; for (var i = 0; i < floor.length; i++) { if (list.includes(floor[i])) { ans.push(floor[i]) } } return ans }
Python解法
l1 = list(map(int,input().strip().split(" "))) l2 = list(map(int,input().strip().split(" "))) class Tree: def __init__(self,x): self.left = None self.right = None self.val = x def fun(l1, l2): if len(l1) == 0: return None root = Tree(l1[0]) sign = l2.index(l1[0]) left_l2 = l2[:sign] left_l1 = [x for x in l1 if x in left_l2] right_l2 = l2[sign+1:] right_l1 = [x for x in l1 if x in right_l2] root.left = fun(left_l1, left_l2) root.right = fun(right_l1, right_l2) return root root = fun(l1,l2) res1 = [] res2 = [] res3 = [] def dfs(root): if root == None: return if(root.left == None and root.right == None): res1.append(root.val) res2.append(root.val) dfs(root.left) dfs(root.right) def dfs1(root): if root == None: return dfs1(root.left) dfs1(root.right) res3.append(root.val) dfs(root) dfs1(root) for e in res1: print(e, end=" ") print() for e in res2: print(e, end=" ") print() for e in res3: print(e,end=" ") print()
class Node: def __init__(self, val): self.val = val self.left = None self.right = None def construct(level, mid): if not level or not mid: return None l = [] for num in mid: l.append(level.index(num)) index = min(l) head = Node(level[index]) i = l.index(index) head.left = construct(level, mid[:i]) head.right = construct(level, mid[i + 1:]) return head leaf1 = [] def leaf(node): if not node: return if not node.left and not node.right: leaf1.append(str(node.val)) leaf(node.left) leaf(node.right) pre = [] def preorder(node): if not node: return pre.append(str(node.val)) preorder(node.left) preorder(node.right) post = [] def postorder(node): if not node: return postorder(node.left) postorder(node.right) post.append(str(node.val)) level = list(map(int, input().split())) mid = list(map(int, input().split())) head = construct(level, mid) leaf(head) preorder(head) postorder(head) print(' '.join(leaf1)) print(' '.join(pre)) print(' '.join(post))
#include <iostream> #include <vector> #include <string> using namespace std; struct Tree { int val; Tree* left; Tree* right; Tree(int n):val(n){left=NULL;right=NULL;}; }; Tree* reBuilt(vector<int> layer,const vector<int> &post, int lf,int rig) { if(lf>rig) return NULL; if(lf==rig) { Tree* root=new Tree(layer[0]); cout<<root->val<<" "; return root; }; Tree* root=new Tree(layer[0]); int pos=0; for(int i=lf;i<=rig;i++) if(post[i]==layer[0]) { pos=i; break; } //找到根所在位置 vector<int> leftTree; vector<int> rightTree; for(int i=1;i<layer.size();i++) { bool isleft=false; for(int j=lf;j<pos;j++) //检索左树 if(post[j]==layer[i]) { isleft=true; break; } if(isleft) leftTree.push_back(layer[i]); else rightTree.push_back(layer[i]); } //左右树分类完毕 root->left=reBuilt(leftTree, post, lf, pos-1); root->right=reBuilt(rightTree, post, pos+1, rig); return root; } void PreOrder(Tree *root) { if(root==NULL) return; cout<<root->val<<" "; PreOrder(root->left); PreOrder(root->right); } void AfterOrder(Tree *root) { if(root==NULL) return; AfterOrder(root->left); AfterOrder(root->right); cout<<root->val<<" "; } int main() { vector<int> layer; vector<int> post; string tmp; getline(cin,tmp); int num=0; for(int i=0;i<tmp.length();i++) { if(tmp[i]!=' ') { num*=10; num+=tmp[i]-'0'; } if(tmp[i]==' '||i==tmp.length()-1) { layer.push_back(num); // cout<<layer.back()<<" "; num=0; } } // cout<<endl; getline(cin,tmp); num=0; for(int i=0;i<tmp.length();i++) { if(tmp[i]!=' ') { num*=10; num+=tmp[i]-'0'; } if(tmp[i]==' '||i==tmp.length()-1) { post.push_back(num); // cout<<post.back()<<" "; num=0; } } //获取数据完成 Tree* root=reBuilt(layer, post, 0,post.size()-1); cout<<endl; PreOrder(root); cout<<endl; AfterOrder(root); cout<<endl; return 0; }
//层序遍历和中序遍历重建二叉树 import java.util.Arrays; import java.util.ArrayList; import java.util.Scanner; public class Main{ class TreeNode{ int val = 0; TreeNode left = null; TreeNode right = null; TreeNode(int val){ this.val = val; } } private ArrayList<Integer> leaves = new ArrayList<Integer>(); private ArrayList<Integer> pre = new ArrayList<>(); private ArrayList<Integer> last = new ArrayList<>(); //找出数组中某个元素的坐标 public int findIndex(int[] array, int val){ for(int i = 0; i < array.length; i++){ if(array[i] == val) return i; } return -1; } //重建二叉树 public TreeNode constructT(int[] layer, int[] mid){ if(layer.length == 0) return null; if(layer.length == 1){ leaves.add(layer[0]); TreeNode node = new TreeNode(layer[0]); return node; } //根节点 int val = layer[0]; TreeNode root = new TreeNode(val); //将中序遍历根据根节点分为左右两棵子树的中序遍历 int index = findIndex(mid, val); if(index == 0) root.left = null; else{ int[] left = Arrays.copyOfRange(mid,0, index); //在层序遍历数组layer中找出左子树的层序遍历数组 int[] layerl = new int[left.length]; for(int i = 0,j=0; i < layer.length&&j < left.length;i++){ if(findIndex(left,layer[i])!=-1){ layerl[j] = layer[i]; j++; } } root.left = constructT(layerl,left); } if(index == mid.length-1) root.right = null; else{ int[] right = Arrays.copyOfRange(mid,index+1, mid.length); //在层序遍历数组layer中找出右子树的层序遍历数组,为了节省时间,倒序查找 int[] layerr = new int[right.length]; for(int i = layer.length-1,j=right.length-1; i >=0&&j >=0;i--){ if(findIndex(right,layer[i])!=-1){ layerr[j] = layer[i]; j--; } } root.right = constructT(layerr,right); } return root; } public void preOrder(TreeNode root){ if(root != null){ pre.add(root.val); preOrder(root.left); preOrder(root.right); } } public void lastOrder(TreeNode root){ if(root != null){ lastOrder(root.left); lastOrder(root.right); last.add(root.val); } } public static void main(String[] args){ Scanner in = new Scanner(System.in); String first = in.nextLine(); String second = in.nextLine(); String[] f = first.split(" "); String[] s = second.split(" "); if(s.length == 0){ System.out.println(); System.out.println(); System.out.println(); return; } int[] layer = new int[f.length]; int[] mid = new int[s.length]; for(int i = 0; i < f.length; i++){ layer[i] = Integer.valueOf(f[i]); mid[i] = Integer.valueOf(s[i]); } Main m = new Main(); TreeNode root = m.constructT(layer,mid); m.preOrder(root); m.lastOrder(root); for(int i = 0; i < m.leaves.size(); i++){ System.out.print(m.leaves.get(i)+" "); } System.out.println(); for(int i = 0; i < m.pre.size(); i++){ System.out.print(m.pre.get(i)+" "); } System.out.println(); for(int i = 0; i < m.last.size(); i++){ System.out.print(m.last.get(i)+" "); } System.out.println(); } }
import java.util.Arrays; import java.util.Scanner; class Treenode{ public int val; public Treenode left; public Treenode right; public Treenode(int val) { this.val = val; this.left = null; this.right = null; } public Treenode() { } } public class Main { private static StringBuffer preorderBuffer=new StringBuffer(); private static StringBuffer postorderBuffer=new StringBuffer(); private static StringBuffer leafs=new StringBuffer(); private static void preorder(Treenode root){ if(root!=null) { preorderBuffer.append(root.val+" "); preorder(root.left); preorder(root.right); } } private static void postorder(Treenode root){ if(root!=null) { postorder(root.left); postorder(root.right); postorderBuffer.append(root.val+" "); } } private static Treenode getTreeNode(int[] indexinlevel,int[] midOrder,int from, int to){ if(to<from) return null; if(from==to){ Treenode result=new Treenode(midOrder[from]); leafs.append(midOrder[from]+" "); return result; } int minindex=from; for(int i=from+1;i<=to;i++) { if(indexinlevel[i]<indexinlevel[minindex]) minindex=i; } Treenode result=new Treenode(midOrder[minindex]); result.left=getTreeNode(indexinlevel,midOrder,from,minindex-1); result.right=getTreeNode(indexinlevel,midOrder,minindex+1,to); return result; } private static Treenode getTree(int[] levelOrder,int[] midOrder){ int[] indexinlevel=new int[midOrder.length]; for(int i=0;i<midOrder.length;i++) { for(int j=0;j<levelOrder.length;j++) { if(midOrder[i]==levelOrder[j]) { indexinlevel[i]=j; } } } Treenode tree=getTreeNode(indexinlevel,midOrder,0,midOrder.length-1); return tree; } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String str1=scanner.nextLine(); String str2=scanner.nextLine(); String[] s1=str1.split(" "); int[] params1=new int[s1.length]; String[] s2=str2.split(" "); int[] params2=new int[s2.length]; for(int i=0;i<s1.length;i++) { params1[i]=Integer.parseInt(s1[i]); } for(int i=0;i<s2.length;i++) { params2[i]=Integer.parseInt(s2[i]); } scanner.close(); Treenode tree=getTree(params1,params2); preorder(tree); postorder(tree); System.out.println(leafs.toString().trim()); System.out.println(preorderBuffer.toString().trim()); System.out.println(postorderBuffer.toString().trim()); } }先将中序遍历中的数字,在层序遍历中依次找出,并存储相应层序遍历中的索引。每次根节点都取这个索引数组中最小的值。大概就是这样
#include<bits/stdc++.h> using namespace std; int zu[3000]; void Pre(int i){ cout<<zu[i]<<" "; if(zu[i*2]!=0) Pre(i*2); if(zu[i*2+1]!=0) Pre(i*2+1); } void Post(int i){ if(zu[i*2]!=0) Post(i*2); if(zu[i*2+1]!=0) Post(i*2+1); cout<<zu[i]<<" "; } void In(int i){ if(zu[i*2]==0&&zu[i*2+1]==0) { cout<<zu[i]<<" "; return; } if(zu[i*2]!=0) In(i*2); if(zu[i*2+1]!=0) In(i*2+1); } int main(){ int low,high,shu[3000],len[3000][2]; int pos=1,x; while(cin>>x){ shu[pos++]=x; } for(int i=1;i<3000;i++) //初始化 { len[i][0]=-1; zu[i]=0; } high=pos-1; //中序遍历序列的右端 low=high/2+1; //中序遍历序列的左端 len[1][0]=low; len[1][1]=high; int i=1;pos=1; while(i<=low-1){ //构建完全二叉树 if(len[pos][0]>len[pos][1]||len[pos][0]==-1){ pos++; continue; } int j; for(j=len[pos][0];j<=len[pos][1];j++) if(shu[j]==shu[i]) break; len[2*pos][0]=len[pos][0]; len[2*pos][1]=j-1; len[2*pos+1][0]=j+1; len[2*pos+1][1]=len[pos][1]; zu[pos++]=shu[i++]; } In(1); //打印叶子节点 cout<<endl; Pre(1); cout<<endl; Post(1); }
function TreeNode(x) { this.val = x; this.left = null; this.right = null; } // 重建二叉树 function reConstructBinaryTree(lev, vin) { if (!lev.length || !vin.length) return null; const rootVal = lev[0]; const node = new TreeNode(rootVal); let i = 0; let levLeft = []; let levRight = []; for (; i < vin.length; i++) { if (vin[i] == rootVal) break; } for (let k = 0; k < lev.length; k++) { for (let j = 0; j < i; j++) { if (lev[k] == vin[j]) { levLeft.push(lev[k]); } } for (let j = vin.length - 1 ; j > i ; j--) { if (lev[k] == vin[j]) { levRight.push(lev[k]); } } } node.left = reConstructBinaryTree(levLeft, vin.slice(0,i)); node.right = reConstructBinaryTree(levRight, vin.slice(i + 1)); return node; } // 从左到右节点 let LTR = []; function ltrTree(tn) { if (tn === null) return null; ltrTree(tn.left); ltrTree(tn.right); if (tn.left === null && tn.right === null) { LTR.push(tn.val); } } // 先序遍历 let PRE = []; function preTree(tn) { if (tn === null) return null; PRE.push(tn.val); preTree(tn.left); preTree(tn.right); } // 后序遍历 let LRD = []; function lrdTree(tn) { if (tn === null) return; lrdTree(tn.left); lrdTree(tn.right); LRD.push(tn.val); } let LEV = readline().split(' '); let VIN = readline().split(' '); let tree = reConstructBinaryTree(LEV, VIN); ltrTree(tree); preTree(tree); lrdTree(tree); print(LTR.join(' ')); print(PRE.join(' ')); print(LRD.join(' '));