青铜-二叉树的经典算法题

1.二叉树里的双指针

1.1判断两颗树是否相同

思路:使用两个指针分别遍历两颗树,相同:根节点相同(值相同),根节点的左右孩子相同!需要满足该条件才可以确定两棵树相同

    public boolean isEqual(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 isEqual(t1.leftNode,t2.leftNode) && isEqual(t1.rightNode,t2.rightNode);
    }

1.2判断某颗树是否对称

思路:外侧 == 外侧 ,内侧 == 内侧 ,遍历根节点,根节点的左孩子的最左侧 == 根节点的右孩子的最右侧......

判断两颗树是否对称:传入的是根节点的左右孩子,则是判断该树是否对称

    //t1是根节点的左孩子,t2是根节点的右孩子
    //判断某根树是否是对称
public boolean isSymmetry(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;
        }
        //判断t1的左孩子是否等于t2的右孩子
        //判断t1的右孩子是否等于t2的左孩子
    return isSymmetry(t1.leftNode,t2.rightNode) &&  isSymmetry(t1.rightNode,t2.leftNode);
    }

1.3合并两个二叉树

题意:合并为新的二叉树

 思路:分别遍历两颗树;比较两二叉树的节点①若两节点其中一个为null,则合并后的节点为不为null的节点值;②若两节点都为null,则合并后的节点为null;③两节点都不为null,则合并后的节点的值为两节点的值之和

//t1,t2分别是两颗二叉树
public TreeNode mergeTwoTreeNode(TreeNode t1,TreeNode t2){
        if (t1 == null && t2 == null){
            return null;
        }
        if (t1 == null ){
            return t2;
        }
        if (t2 == null){
            return t1;
        }
        //合并后的节点 mergeNode
        TreeNode mergeNode = new TreeNode(t1.val + t2.val);
        mergeNode.leftNode = mergeTwoTreeNode(t1.leftNode,t2.leftNode);
        mergeNode.rightNode = mergeTwoTreeNode(t1.rightNode,t2.rightNode);
        return mergeNode;
    }

2.路径专题

2.1二叉树的所有路径

/**
     * 寻找二叉树从根节点到叶子节点的全部路径(使用前序遍历) 中左右
     * @param root 二叉树
     * @param paths 单条路径
     * @param res 全部路径的结果
     */
    public static  void traversal(TreeNode root, List<Integer> paths, List<String> res) {
        paths.add(root.val);
        //终止条件
        if (root.leftNode==null && root.rightNode==null){
            res.add(paths.toString());
        }
        if (root.leftNode != null){
            traversal(root.leftNode,paths,res);
            //回溯
            paths.remove(paths.size() - 1);
        }
        if (root.rightNode != null){
            traversal(root.rightNode,paths,res);
            paths.remove(paths.size() - 1);
        }
    }

此处输出格式和实例不同,应做转换!

 2.2判断二叉树路径总和情况

 public boolean isPathEqual(TreeNode root,int sum){
        if (root == null){
            return false;
        }
        if (root.leftNode == null && root.rightNode == null){
            return root.val == sum;
        }
        boolean left = isPathEqual(root.leftNode,sum-root.val);
        boolean right = isPathEqual(root.rightNode,sum-root.val);
        return left || right ;
    }

3.翻转

 思路:从根节点开始,交换左右孩子...

先考虑遍历顺序,若前序遍历,先处理根节点,再考虑孩子节点

public TreeNode invertTree(TreeNode root){
        if (root == null){
            return null;
        }
        //交换左右孩子
        TreeNode temp = root.leftNode;
        root.leftNode = root.rightNode;
        root.rightNode = temp ;
        invertTree(root.leftNode);
        invertTree(root.rightNode);
        return root;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值