lintcode.245 子樹
阿新 • • 發佈:2017-09-02
tco lint note return brush eno str run 存在
感謝您的反饋
樣例
子樹
有兩個不同大小的二進制樹: T1
有上百萬的節點; T2
有好幾百的節點。請設計一種算法,判定 T2
是否為 T1
的子樹。
註意事項
若 T1 中存在從節點 n 開始的子樹與 T2 相同,我們稱 T2 是 T1 的子樹。也就是說,如果在 T1 節點 n 處將樹砍斷,砍斷的部分將與 T2 完全相同。
您在真實的面試中是否遇到過這個題? Yes 哪家公司問你的這個題? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Google Twitter Facebook下面的例子中 T2 是 T1 的子樹:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子樹:
1 3 / \ T1 = 2 3 T2 = 4 / 4
很神奇的一道題,有個樣例是{9,9,9,9,9,9,9.......},會卡住。
就是說開始判斷時,子樹為空有的節點,樹上也不能有,否則就不是子樹了。一開始一直沒想明白。
AC代碼,
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /* * @param T1: The roots of binary tree T1. * @param T2: The roots of binary tree T2. * @return: True if T2 is a subtree of T1, or false. */ bool isSubtree(TreeNode *T1, TreeNode *T2) { bool result = false; if (T2 == NULL) { return true; } if (T1 == NULL) { return false; } if (T1->val == T2->val) { result = hasSubtree(T1,T2); } if (!result) { result = isSubtree(T1->left,T2); } if (!result) { result = isSubtree(T1->right,T2); } return result; } bool hasSubtree(TreeNode *T1, TreeNode *T2) { if(T2==NULL && T1==NULL) return true; if (T1 != NULL && T2!=NULL && T1->val == T2->val) { return hasSubtree(T1->left,T2->left) && hasSubtree(T1->right,T2->right); } return false; } };
很尷尬的是,同樣的代碼,會runtime error。
代碼如下:
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param T1, T2: The roots of binary tree. * @return: True if T2 is a subtree of T1, or false. */ bool isSubtree(TreeNode *T1, TreeNode *T2) { // write your code here bool res= false; if(T2 == NULL) return true; if(T1 == NULL) return false; if(T1 -> val == T2 -> val) res = cmp(T1,T2); if(!res) res=isSubtree(T1->left,T2); if(!res) res=isSubtree(T1->right,T2); return res; } bool cmp(TreeNode *T1,TreeNode *T2){ if(T2 == NULL && T1 == NULL) return true; if(T1 -> val == T2 -> val && T1 != NULL && T2 != NULL) return cmp(T1->left,T2->left) && cmp(T1->right,T2->right); return false; } };
這就很尷尬了,我也不知道咋回事。。。求大佬指點
lintcode.245 子樹