題目大意是要求你判斷t所代表的樹是否為s所代表樹的子樹。
我的解題思路:
既然要比較是否含有,那麼肯定需要遍歷,選擇什麼樣的遍歷序列? 我認為只有先序好些一點。
那麼對s進行先序遍歷,如果此時s所指的結點的val等於t所指的結點的val,那麼可以進行比較。
如何判斷完全相等呢? 有乙個性質:通過先序遍歷和中序遍歷能夠完全確定一棵二叉樹,那麼我只需要對這兩棵樹進行遍歷,那麼通過它們的遍歷序列我就能夠判斷這兩棵樹是否完全相同。
1/**view code2* definition for a binary tree node.
3* struct treenode
8* };9*/
10class
solution 18}
1920
void inorder(treenode *s,vector&v)26}
2728
bool isequal(vector& v1,vector&v2)
32else
37}
38return
true;39
}40}41
42//
對s進行先序遍歷,如果當前結點的值和t的root的值相同,進行比對;
43void dfs(treenode *s,treenode *t,bool&flag)
47if(s!=null)58}
59 dfs(s->left,t,flag);
60 dfs(s->right,t,flag);61}
62}6364
//s 是否含有 t
65bool issubtree(treenode* s, treenode*t)
70 };
1這一比較,就發現自己對遞迴,對樹的理解真是糟糕透頂。class
solution
9return
false;10
}11return s->val==t->val && isequal(s->left,t->left) && isequal(s->right,t->right);12}
1314
//true條件只能通過isequal實現; 另外這個**的返回值非常巧妙,對於||,只需要有乙個true,那麼最上層的返回值一定為true
15bool issubtree(treenode* s, treenode*t)
19return isequal(s,t) || issubtree(s->left,t) || issubtree(s->right,t);20}
21 };
在issubtree中,實現了判斷t是否為s的子樹;
在check中,判斷s和t是否相同;
對於s和t而言,如果t是s的子樹,那麼有三種可能,t和s相同,t是s左子樹的子樹,t是s右子樹的子樹; 對應:
return check(s, t) || issubtree(s->left, t) || issubtree(s->right, t);對於s和t相等,需要保證它們當前指的結點值相等以及左子樹和右子樹都相等; 遞迴終止條件為出現不相等,或者都等於null;
鶸。
leetcode 572 另乙個樹的子樹
在樹的遍歷中,時刻警惕每一處需要訪問的有沒有可能是null,如果null怎麼處理 判斷指標是不是null既能避免訪問空指標而造成程式崩潰,同時也經常能設定遞迴的退出條件 接著先審題 給定兩個非空二叉樹 s 和 t,檢驗s 中是否包含和 t 具有相同結構和節點值的子樹。s 的乙個子樹包括 s 的乙個節...
Leetcode 572 另乙個樹的子樹
題目描述 給定兩個非空二叉樹s和t,檢驗s中是否包含和t具有相同結構和節點值的子樹。s的乙個子樹包括s的乙個節點和這個節點的所有子孫。s也可以看做它自身的一棵子樹。示例 1 給定的樹 s 3 4 5 1 2給定的樹 t 4 1 2返回true,因為 t 與 s 的乙個子樹擁有相同的結構和節點值。示例...
LeetCode 572 另乙個樹的子樹
給定兩個非空二叉樹s和t,檢驗s中是否包含和t具有相同結構和節點值的子樹。s的乙個子樹包括s的乙個節點和這個節點的所有子孫。s也可以看做它自身的一棵子樹。示例 1 給定的樹 s 3 4 5 1 2給定的樹 t 4 1 2返回true,因為 t 與 s 的乙個子樹擁有相同的結構和節點值。示例 2 給定...