LeetCode 572 另乙個樹的子樹

2022-02-05 22:13:59 字數 1655 閱讀 6652

題目大意是要求你判斷t所代表的樹是否為s所代表樹的子樹。  

我的解題思路:

既然要比較是否含有,那麼肯定需要遍歷,選擇什麼樣的遍歷序列?    我認為只有先序好些一點。

那麼對s進行先序遍歷,如果此時s所指的結點的val等於t所指的結點的val,那麼可以進行比較。

如何判斷完全相等呢?     有乙個性質:通過先序遍歷和中序遍歷能夠完全確定一棵二叉樹,那麼我只需要對這兩棵樹進行遍歷,那麼通過它們的遍歷序列我就能夠判斷這兩棵樹是否完全相同。    

1/**

2* 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 };

view code

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 給定...