【数据结构_10】二叉树(2)

一、根据树的遍历结果还原树

紧接着(1),我们继续来讨论:如果给了树的遍历结果,我们能否把这个树给还原出来呢?

如果只给一种遍历结果,那么我们无法对树进行还原。

只有给了我们先序+中序,或者后序+中序这两种情况的遍历结果,我们才可以得到树的结果。

*这里不考虑层序的问题,这样的问题是不考层序的。

(1)如果给了先序遍历和中序遍历

1.先序遍历的第一个元素就是根节点

2.在中序遍历中,左子树就在根节点左侧,右子树就在根节点右侧,拿着根节点E,在中序结果中进行查找。

(2)如果给了后序遍历和中序遍历

1.取出后序遍历的最后一个元素,那就是树的根节点

2.拿着根节点在中序中进行查找,查找规则:在中序遍历中,左子树就在根节点左侧,右子树就在根节点右侧,拿着根节点E,在中序结果中进行查找。

3.进行左右子树的还原

*总而言之,根据前序遍历后序遍历中序遍历进行树的还原实质上仅仅是考察这三个知识点:

1.先序的第一个元素,就是根节点(后序也是类似,最后一个元素是根节点)

2.先序中根节点左侧的内容就是左子树的中序结果,右侧内容就是右子树的中序结果

3.先序中,如果明确了根节点和子树范围,此时,子树范围对应的内容就是子树的先序结果(后序也是类似,子树对应的内容就是子树的后序结果)

二、求树的节点个数

java 复制代码
    //根据递归求树的节点个数
    public static int size(Node root){
        if(root == null){
            return 0;
        }
        int leftsize = size(root.left);
        int rightsize = size(root.right);
        return 1+leftsize+rightsize;

    }

三、根据递归求叶子节点的个数

java 复制代码
    public static int getLeafSize(Node root){
        if(root == null){
            return 0;
        }

        if(root.left == null && root.right == null){
            return 1;
        }
        return getLeafSize(root.left)+getLeafSize(root.right);
    }

三、 求二叉树第 k 层节点的个数

java 复制代码
    public static int getLevelNodeCount(int k ,Node root){
        //如果输入的k值小于1 或者 树为空 就返回0
        if(k<1 || root == null){
            return 0;
        }
        if(k==1){
            return 1;
        }
        return getLeafSize(root.right)+getLeafSize(root.left);
    }

思路:如果我们想要获得第k层节点的个数,如果k<1,这是非法的输入,如果k=1,也就是求第一层节点的个数,而非空的树第一层的节点个数也就是1。如果k>1,求第k层节点的个数,我们可以将这个问题转化为求左子树k-1层节点的个数+右子树k-1层的节点个数

四、求二叉树的高度

高度/深度也就是所要求的二叉树中,从根节点出发到任意节点,路径的最大长度。用递归的方式来求解,也就是要求A这个树的高度= max(B的高度,C的高度)+1

java 复制代码
    //求二叉树的深度
    public static int getHeight(Node root ){
        if(root == null){
            return 0;
        }
        return 1+(Math.max(getHeight(root.left),getHeight(root.right)));

    }

五、检测值为value的元素是否存在

存在返回val所在节点的引用,不存在就返回null。首先判定根节点是不是val,如果是,就直接返回该根节点,如果不是,继续递归在左子树中找,如果也没找到,就继续递归在右子树中进行查找。

java 复制代码
    //检测值为val的元素是否存在
    public static Node find(Node root,String val){
        if(root== null){
            return null;
        }
        if(root.val.equals(val)){
            return root;
        }
        //在左子树中进行查找
        Node findResult = find(root.left,val);
        if(findResult != null){
            return  findResult;
        }
        return find(root.right,val);
    }

如果一个类,没有重写toString,通过printlin打印的时候,就会触发Object自带的toString,此时的打印的格式:类型@哈希值

相关推荐
h_a_o777oah6 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO96 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician6 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.6 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
程序员清风8 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
Logic10111 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
殷色玫瑰12 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
写后端的胖头鱼14 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘14 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包15 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表