LeetCode10_相同的树(深度递归、广度队列、二叉树问题系列模板)

一、题目描述


给定两个二叉树,编写一个函数来检验它们是否相同。

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

在这里插入图片描述

二、题解

2.1深度递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public boolean isSameTree(TreeNode p, TreeNode q) {
    
    
        if(p == null && q == null){
    
    
            return true;
        }
        if(p == null || q == null){
    
    
            return false;
        }
        else if(p.val != q.val){
    
    
            return false;
        }
        else{
    
    
            return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        }
       
       
    }
}

2.2拓展

在这里插入图片描述

二叉树系列问题模板:

  • 相同的树
  • 删除二叉搜索树中的节点
  • 二叉搜索树中的插入操作
  • 二叉搜索树中的搜索
  • 验证二叉搜索树

参考:labuladong的算法小超

参考:LeetCode题解

在这里插入图片描述

2.2.1二叉树
  • 二叉树的节点值加一、判断两颗二叉树是否相等
    在这里插入图片描述
2.2.2BST二叉搜索树

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
删除操作设计情况较复杂,不在举栗

2.3广度队列、前、中、后单栈、后序双栈解法

 /**
     * 递归解法
     *
     * @param p
     * @param q
     * @return
     */
    public boolean isSameTree(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        if (p.val == q.val) {
    
    
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        } else {
    
    
            return false;
        }
    }

    /**
     * 非递归前序遍历判断相等
     * 根左右
     *
     * @param p
     * @param q
     * @return
     */
    public boolean isSameTreePre(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        Stack<TreeNode> stackP = new Stack<>();
        stackP.add(p);
        Stack<TreeNode> stackQ = new Stack<>();
        stackQ.add(q);
        while (!stackP.isEmpty() || !stackQ.isEmpty()) {
    
    
            TreeNode pNode = stackP.pop();
            TreeNode qNode = stackQ.pop();
            if (pNode == null && qNode == null) continue;
            if (pNode == null) return false;
            if (qNode == null) return false;
            if (pNode.val != qNode.val) {
    
    
                return false;
            } else {
    
    
                stackP.add(pNode.right);
                stackQ.add(qNode.right);
                stackP.add(pNode.left);
                stackQ.add(qNode.left);
            }
        }
        return true;
    }

    /**
     * 非递归中序遍历判断两棵二叉树是否相等
     * 左根右
     *
     * @param p
     * @param q
     * @return
     */
    public boolean isSameTreeMid(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        Stack<TreeNode> stackP = new Stack<>();
        Stack<TreeNode> stackQ = new Stack<>();
        while (p != null || q != null || !stackP.isEmpty() || !stackQ.isEmpty()) {
    
    
            if (p != null && q != null) {
    
    
                stackP.add(p);
                stackQ.add(q);
                p = p.left;
                q = q.left;
            } else if (q == null && p == null) {
    
    
                p = stackP.pop();
                q = stackQ.pop();
                if (p.val != q.val) {
    
    
                    return false;
                }
                p = p.right;
                q = q.right;
            } else {
    
    
                return false;
            }
        }
        return true;
    }

    /**
     * 二叉树后序遍历判断两颗树相等
     * 左右根
     * 双栈解法
     *
     * @param p
     * @param q
     * @return
     */
    public boolean isSameTreeEnd1(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        Stack<TreeNode> stackP = new Stack<>();
        Stack<TreeNode> stackPTmp = new Stack<>();
        Stack<TreeNode> stackQ = new Stack<>();
        Stack<TreeNode> stackQTmp = new Stack<>();
        while (p != null || q != null || !stackPTmp.isEmpty() || !stackQTmp.isEmpty()) {
    
    
            if (p != null && q != null) {
    
    
                stackP.add(p);
                stackPTmp.add(p);
                stackQ.add(q);
                stackQTmp.add(p);
                p = p.right;
                q = q.right;
            } else if (p == null && q == null) {
    
    
                p = stackPTmp.pop();
                p = p.left;
                q = stackQTmp.pop();
                q = q.left;
            } else {
    
    
                return false;
            }
        }

        while (!stackP.isEmpty() && !stackQ.isEmpty()) {
    
    
            if (stackP.pop().val != stackQ.pop().val) {
    
    
                return false;
            }
        }

        return true;
    }

    /**
     * 二叉树后序遍历单栈实现对比判断
     *
     * @param p
     * @param q
     * @return
     */
    public boolean isSameTreeEnd2(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        Stack<TreeNode> stackP = new Stack<>();
        stackP.add(p);
        TreeNode pPre = null;
        Stack<TreeNode> stackQ = new Stack<>();
        stackQ.add(q);
        TreeNode qPre = null;
        while (!stackP.isEmpty() || !stackQ.isEmpty()) {
    
    
            p = stackP.peek();
            q = stackQ.peek();
            if (((pPre != null && (p.left == pPre || p.right == pPre)) || (p.left == null && p.right == null)) &&
                    ((qPre != null && (q.left == qPre || q.right == qPre)) || (q.left == null && q.right == null))) {
    
    
                if (p.val != q.val) {
    
    
                    return false;
                }
                pPre = p;
                qPre = q;
                stackP.pop();
                stackQ.pop();
            } else {
    
    
                if (p.right != null && q.right != null) {
    
    
                    stackP.add(p.right);
                    stackQ.add(q.right);
                } else if (p.right != null || q.right != null) {
    
    
                    return false;
                }

                if (p.left != null && q.left != null) {
    
    
                    stackP.add(p.left);
                    stackQ.add(q.left);
                } else if (p.left != null || q.left != null) {
    
    
                    return false;
                }
            }
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/qq_24654501/article/details/111072111