二叉树的简单操作

1.相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false

解题思路:若两颗树都为空,那么这两棵树相同。若其中一棵树为空,那这两棵树不相同。若这两棵树都不为空,先断根节点是否相同,相同返回true,不相同直接返回false,再依次判断左子树和右子树,若都相同,则返回true。

代码:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){
            return true;
        }
        if(p==null||q==null){
            return false;
        }
        if(p.val!=q.val){
            return false;
        }
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);

    }
}

2.另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

解题思路:如果两棵树都为空,返回true;如果其中一棵树为空,返回false;如果两棵树完全相同,返回true;如果两棵树都不为空,依次判断root的左右子树是否包含subRoot,若包含,返回true,反之返回false。

代码:
 

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null&&subRoot==null){
            return true;
        }
        if(root==null||subRoot==null){
            return false;
        }
        if(isSameTree(root,subRoot)){
            return true;
        }
        return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);


    }
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){
            return true;
        }
        if(p==null||q==null){
            return false;
        }
        if(p.val!=q.val){
            return false;
        }
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);

    }
}

3.翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

解题思路:若树为空,直接返回这颗树;若树的左子树和右子树都为空,直接返回这棵树;若左右子树都不为空,递归的遍历这棵树的左右子树,从叶子节点开始翻转,如果左右两颗子树都已经翻转,只需要交换两颗子树的位置。

代码:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null||(root.left==null&&root.right==null)){
            return root;
        }
        root.left=invertTree(root.left);
        root.right=invertTree(root.right);
        TreeNode num=root.left;
        root.left=root.right;
        root.right=num;
        return root;


    }
}

4.对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

解题思路1:若树为空,则返回true;若该树的左树和右数都为空,则返回true;若该树的左右子树不为空,判断左右两棵子树是否轴对称相等。

代码1:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null||(root.left==null&&root.right==null)){
            return true;
        }
        return isMirror(root.left,root.right);


    }
    public boolean isMirror(TreeNode t1,TreeNode t2){
        if(t1==null&&t2==null){
            return true;
        }
        if(t1==null||t2==null){
            return false;
        }
        if(t1.val!=t2.val){
            return false;
        }
        return isMirror(t1.left,t2.right)&&isMirror(t1.right,t2.left);
    }
}

解题思路2:若该树为空,则返回true;若该树的左子树和右子树都为空,则返回true;若左右子树不为空,将该树的左子树翻转,若翻转后的左子树与右子树相等,返回true。

代码2:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null||(root.left==null&&root.right==null)){
            return true;
        }
        root.left=invertTree(root.left);
        return isSame(root.left,root.right);


    }
    public TreeNode invertTree(TreeNode root) {
        if(root==null||(root.left==null&&root.right==null)){
            return root;
        }
        root.left=invertTree(root.left);
        root.right=invertTree(root.right);
        TreeNode num=root.left;
        root.left=root.right;
        root.right=num;
        return root;


    }
    public boolean isSame(TreeNode t1,TreeNode t2){
        if(t1==null&&t2==null){
            return true;
        }
        if(t1==null||t2==null){
            return false;
        }
        if(t1.val!=t2.val){
            return false;
        }
        return isSame(t1.left,t2.left)&&isSame(t1.right,t2.right);
    }
}

5.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

 解题思路:若该树为空,返回true;若该树的左右节点都为空,返回true;若该树的左右节点不为空,使用绝对值方法求出左右节点高度差的绝对值,若绝对值大于1,返回false。

代码:

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null||(root.left==null&&root.right==null)){
            return true;
        }
        int leftHeight=height(root.left);
        int rightHeight=height(root.right);
        int abs=Math.abs(leftHeight-rightHeight);
        if(abs>1){
            return false;
        }
        return isBalanced(root.left)&&isBalanced(root.right);

    }
    public int height(TreeNode root){
        return root==null?0:1+Math.max(height(root.left),height(root.right));
    }
}

你可能感兴趣的:(数据结构)