二叉树遍历

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历相关的知识,希望对你有一定的参考价值。

已知7个节点的二叉树的先根遍历是1 2 4 5 6 3 7(……), 后根遍历是4 6 5 2 7 3 1, 则该二叉树

的可能的中根遍历是

如果你说的先根遍历和前序遍历是一回事,那么给你方法和结果
自己模拟递推过程或者编个程序推去吧:
先确定根
然后试着把一种遍历中连续的部分分成两部分
使得另一个也分成两部分且组成一样
画出树
循环。。。
比如:根是1,然后把先根分成:2456和37两部分
(因为这时后根能分成连续的4652和73)
那么左子树根为2,右子树根为3
其实这事就发现更简单的方法:
先在先根中找到当前连续最前边的一个
然后找到后根中的这个在的位置,在后面分开
最后结果:
1为根
1的左:2
1的右:3
2的左:4(叶)
2的右:5
5的左或右:6(叶)
3的左或右:7(叶)
那么中根:4265173
4256173
4265137
4256137
结束
参考技术A 中序遍历是4 2 6 5 1 7 3

因为中序遍历的规则是首先遍历左子数,然后根节点 最后右子树,同时在遍历左右子树仍然遵循这样的规则

进行先序和后序是也是这样 跟总规则一样

二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树

一.根据一棵树的前序遍历与中序遍历构造二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

思路

首先我们可以知道通过前序遍历和中序遍历,就可以知道整个二叉树的结构了。然后自上而下的深度递归构造。

代码

private int index=0;
    public TreeNode buildTree(int[] preorder, int[] inorder) 
        index=0;
        return  buildTreeHelper(preorder,inorder,0,inorder.length);
    

    private TreeNode buildTreeHelper(int[] preorder, int[] inorder, int left, int right) 
        //空树
        if(left>=right)
            return null;
        
        //遍历完
        if(index>=preorder.length)
            return null;
        
        //根据当前根节点的值创建出根节点
        TreeNode root=new TreeNode(preorder[index]);
        index++;
        //中序遍历数组中找到root的位置
        int pos=find(inorder,left,right,root.val);
        //左子树是root在中序遍历结果中的左边的节点
        root.left=buildTreeHelper(preorder,inorder,left,pos);
        //同理,右子树是root在中序遍历结果中的右边的节点,记得要pos+1
        root.right=buildTreeHelper(preorder,inorder,pos+1,right);
        return root;
    
    
    //查找出root在中序遍历数组中的位置
    private int find(int[] inorder, int left, int right, int toFind) 
        //遍历查找
        for (int i = left; i < right; i++) 
            if(inorder[i]==toFind)
                return i;
            
        
        //没找到按理不存在(一定能找到)
        return -1;
    

二.根据一棵树的中序遍历与后序遍历构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。

思路

首先一定要先看懂我上面的前序遍历和中序遍历构造二叉树(这个理解之后,那么这题就很简单了),看图

所以我们只需要逆置一下二叉树的后序遍历,那么就得到前序遍历的镜像了,根右左。所以就转换成了前序遍历和中序遍历二叉树的问题了。构造左右的时候只需要注意,先构造右,,再构造左即可,其余代码一模一样。

代码

private int index=0;
    public TreeNode buildTree(int[] inorder, int[] postorder) 
        index=0;
        //逆置后序遍历数组
        reverse(postorder);
        return  buildTreeHelper(postorder,inorder,0,inorder.length);
    
    //因为后序遍历,逆置一下,就是先序遍历的镜像,根右左
    //这样就转化成 先序与中序遍历构造二叉树的问题了(只是要注意左右子树顺序)
    private void reverse(int[] postorder) 
        int left=0;
        int right=postorder.length-1;
        //交换
        while (left<right)
            int tmp=postorder[left];
            postorder[left]=postorder[right];
            postorder[right]=tmp;
            left++;
            right--;
        
    

    private TreeNode buildTreeHelper(int[] postorder, int[] inorder, int left, int right) 
        //空树
        if(left>=right)
            return null;
        
        //遍历完
        if(index>=postorder.length)
            return null;
        
        //根据当前根节点的值创建出根节点
        TreeNode root=new TreeNode(postorder[index]);
        index++;
        int pos=find(inorder,left,right,root.val);
        //代码和前序遍历与中序遍历构造二叉树一样
        //只是需要注意改动一下左右构造的顺序即可
        //代码不做详细注解了,不懂的可以看前序和中序构造二叉树的代码注释(基本一模一样)
        root.right=buildTreeHelper(postorder,inorder,pos+1,right);
        root.left=buildTreeHelper(postorder,inorder,left,pos);
        return root;
    

    private int find(int[] inorder, int left, int right, int toFind) 
        for (int i = left; i < right; i++) 
            if(inorder[i]==toFind)
                return i;
            
        
        return -1;
    

有人可能会问,为啥没有前序遍历和后序遍历构造二叉树的题呢?
嘿嘿嘿,首先通过遍历构造二叉树,一定要知道两种遍历结果,并且中序遍历一定要存在,不然无法确定二叉树的结果哦。

以上是关于二叉树遍历的主要内容,如果未能解决你的问题,请参考以下文章

JS中的二叉树遍历

递归遍历二叉树

Python 二叉树的创建和遍历、重建

二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树

二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树

二叉树(2.二叉树的遍历和实现)