樹的子結構
題目描述:
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
問題分析:
判斷B是不是A的子樹,那麼就必須有兩個操作,
遍歷A子樹找對應的根結點,
遍歷B結點比較A樹的子結構是否和B樹相同
通過遞歸完成B樹節點的逐個比較,return 結果
代碼展示:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
// 1,在樹A中找到和樹B一樣的節點R
// 2,找以節點R爲根結點的子樹是包含樹B
var result = false;
//兩個樹都不爲空的情況下進行比較,否則返回false
if(pRoot1!=null && pRoot2!=null){
//找到對應樹B的根結點的點
if(pRoot1.val == pRoot2.val){
//以這個根結點爲起點進行判斷是否包含樹B
result = haveTree(pRoot1,pRoot2);
}
if(!result){
//如果找不到,就以pRoot1的左兒子爲起點,進行判斷
result = haveTree(pRoot1.left,pRoot2);
}
if(!result){
//如果還找不到,就以pRoot1的右兒子爲起點,進行判斷
result = haveTree(pRoot1.right,pRoot2);
}
}
return result;
}
//判斷是否是子結構
function haveTree(root1,root2){
//如果樹B已經遍歷結束,且都符合,返回true
if(root2 == null)
return true;
//如果樹B沒有遍歷結束,但是樹A遍歷結束了,則結構不對,返回false
if(root1 == null)
return false;
//如果有一個結點不同,則不符合條件,返回false
if(root1.val != root2.val)
return false;
//如果根結點符合條件,則比較子節點
return haveTree(root1.left,root2.left) && haveTree(root1.right,root2.right);
}
總結:
如果說鏈表的操作中遍歷居多,那麼樹中就是更多了些遞歸,鏈表有結點,樹也有結點,多了兩個子節點
next,和left、right 是具有同一效應的符號,這個需要注意一下。
鏈表結構的定義
function ListNode(x){
this.val = x;
this.next = null;
}
樹結構的定義
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}