LeetCode二叉樹專題 (2) 相同的樹

題目

給定兩個二叉樹,編寫一個函數(shù)來檢驗它們是否相同。
如果兩個樹在結構上相同,并且節(jié)點具有相同的值,則認為它們是相同的。

解題思路

這道題的解題思路比較簡單,就是同時遍歷兩顆樹的問題,并比較每個遍歷的結點的值是否相等即可。問題就變成了怎么遍歷,根據(jù)樹型知識
)里描述的,我們有很多種遍歷的方法可以選擇,通過深度優(yōu)先和廣度優(yōu)先都可以,每種優(yōu)先都可以使用遞歸和迭代實現(xiàn)。先看遞歸解決方案

遞歸解法

先找子問題,兩顆樹相同,就是根節(jié)點相同,并且左右子樹也符合這個要求,那么子問題就是每個遍歷到的結點都相同。終止條件就是兩個結點是否相同的條件。我們就可以上述的分解辦法,不斷的迭代這個子問題。

遞歸解法代碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //終止條件
        if(p==null && q==null){
            //同時為空,符合要求
            return true;
        }else if(p==null || q==null){
            //不同時為空,說明有不同的結點
            return false;
        }else if(p.val != q.val){
            return false;
        }
        //子問題:如果左右子樹都是相同的樹,那么就是相同的樹
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

迭代解法

對于迭代,我們可以深度優(yōu)先或者廣度優(yōu)先,深度優(yōu)先就是棧,后入先出的數(shù)據(jù)結構,遍歷兩顆樹,比較每一個迭代到的結點?;蛘呤褂脧V度優(yōu)先,層序遍歷兩顆樹,也是比較每一個被遍歷到的結點,方法很多,大家可以每一種都試試,這里只用棧結構的前序遍歷完成解題。先看下怎么使用單個棧完成前序遍歷

如何使用棧實現(xiàn)前序遍歷

image

上面這棵樹的前序遍歷是:FCADBEHGM
我們拿到一個棧
先放入根節(jié)點F (棧結構:F)

取出棧頂元素并輸出F (棧結構:空)
然后放入他的右子樹和左子樹(EC)

取出棧頂并輸出C (E)
然后放入他的右子樹和左子樹(ADE),

....循環(huán)上面的步驟,直到棧為空,就完成了前序遍歷的過程

public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> stack = new Stack<TreeNode>();
        //先放入根節(jié)點
        stack.push(root);
        while (!stack.isEmpty()) {
            //執(zhí)行循環(huán)體,先取出棧頂元素并輸出,并依次放入右左結點
            TreeNode node = stack.pop();
            res.add(Integer.valueOf(node.val));
            if (node.right != null) {
                stack.push(node.right);
            }
            if (node.left != null) {
                stack.push(node.left);
            }
        }
        return res;
    }

迭代解法代碼

上面給出了使用棧實現(xiàn)前序遍歷的代碼,我們只要同時對兩顆樹進行操作即可,并判斷每一個遍歷到的結點

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;
    }
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容