二叉树的前序、中序、后序遍历;根据前序和中序或中序和后序生成二叉树
给定如下二叉树:
前序遍历结果:1234567
中序遍历结果:3241657
后序遍历结果:3426751
遍历代码实现:思路:将子节点以及其下节点看做一个树,相当于递归获取树的每个节点
//前序遍历: 根、左节点、右节点,
public static void preIterate(TreeNode root){
if(root==null) return;
System.out.print(root.val+" ");
preIterate(root.left);
preIterate(root.right);
}
//中序遍历: 左节点、根、右节点
public static void midIterate(TreeNode root){
if(root==null) return;
midIterate(root.left);
System.out.print(root.val+" ");
midIterate(root.right);
}
//后序遍历: 左节点、右节点、根
public static void sufIterate(TreeNode root){
if(root==null) return;
sufIterate(root.left);
sufIterate(root.right);
System.out.print(root.val+" ");
}
```
根据前序和中序或中序和后序生成二叉树:
思路:中序是根据根节点分成两边,左子树在根节点的左边,右子树节点在根的右边。
①对于前序和中序:前序是先打印根节点,对于前序数据正序处理。
②对于中序和后序:后序遍历根节点在最后,对于后序数组倒序处理。
对于分开的两端同样符合上述说明,所以迭代处理即可,主要在于计算好分开两端的区间。
//根据前序和中序生成二叉树:
public static TreeNode reConstructBinaryTreeThroughMidAndSuf(int[] in,int[] suf){
TreeNode root = null;
if(suf.length != in.length){
return null;
}
root = treeBuildSuf(suf, 0, suf.length-1, in, 0, in.length-1);
return root;
}
private static TreeNode treeBuild(int[] pre,int preStart, int preEnd, int [] in, int inStart, int inEnd){
if(preStart>preEnd || inStart>inEnd) return null;
TreeNode head = new TreeNode(pre[preStart]);
int rootLoc = findLoc(in,pre[preStart],inStart,inEnd);
int step = rootLoc-inStart;
head.left = treeBuild(pre, preStart+1, preStart+step, in, inStart, rootLoc-1);
head.right = treeBuild(pre, preStart+step+1, preEnd, in, rootLoc+1, inEnd);
return head;
}
//根据中序和后序生成二叉树:
public static TreeNode reConstructBinaryTreeThroughPreAndMid(int [] pre,int [] in) {
TreeNode root = null;
if(pre.length != in.length){
return null;
}
root = treeBuild(pre, 0, pre.length-1, in, 0, in.length-1);
return root;
}
private static TreeNode treeBuildSuf(int[] suf,int sufStart, int sufEnd, int [] in, int inStart, int inEnd){
if(sufStart>sufEnd || inStart>inEnd) return null;
TreeNode head = new TreeNode(suf[sufEnd]);
int rootLoc = findLoc(in,suf[sufEnd],inStart,inEnd);
head.left = treeBuildSuf(suf, sufStart, sufStart + rootLoc - inStart -1 , in, inStart, rootLoc-1);
head.right = treeBuildSuf(suf, sufStart+rootLoc-inStart, sufEnd-1, in, rootLoc+1, inEnd);
return head;
}
public static int findLoc( int [] in , int value, int start, int end){
for(int i = start; i<= end; i++){
if(in[i]==value){
return i;
}
}
return -1;
}
有问题欢迎在评论区一起讨论,一起学习!