1.輸入k ,找第k層節點個數
int TreeKlevel(BTNode*root,int k) {if (root == NULL) {return 0;}if (k == 1) {return 1;}return TreeKlevel(root->left, k - 1)+TreeKlevel(root->right, k - 1);
}
在這里我們要確定遞歸子問題,第一個就是NULL時返回,還有一個就是k=1時就是我們要找的層數。
2.輸入一個數,查找該數,找到了返回其地址。
BTNode* TreeFind(BTNode* root, int x) {if (root == NULL) {return NULL;}if (root->val == x) {return root;}BTNode* ret1 = TreeFind(root->left, x);if (ret1)return ret1;BTNode* ret2 = TreeFind(root->right, x);if (ret2)return ret2;return NULL;
}
在這里我們需要弄明白的是,在某個開辟的棧幀中找到了該數據,直接返回其指針,是得不到它的地址的。
3.判斷兩棵樹是相同的
bool isSametree(BTNode* root1, BTNode* root2) {//都為空if (root1 == NULL && root2 == NULL) {return true;}//其中一個為空if (root1 == NULL || root2 == NULL) {return false;}if (root1->val != root2->val) {//判斷值是否相同return false;}return isSametree(root1->left, root2->left) &&isSametree(root1->right, root2->right);
}
4.判斷是否為鏡像/對稱二叉樹,也就是左右子樹是否相同
bool _isSymmetric(BTNode* root1, BTNode* root2) {//根比較//左子樹和右子樹比較//右子樹和左子樹比較//都為空if (root1 == NULL && root2 == NULL) {return true;}//一個為空一個不為空if (root1 == NULL || root2 == NULL) {//短路求值return false;}if (root1->val != root2->val) {return false;}return _isSymmetric(root1->left, root2->right) &&_isSymmetric(root1->right, root2->left);
}
bool isSymmetri(BTNode* root) {return _isSymmetric(root->left, root->right);//將根的兩個子樹傳遞給子函數
}
5.在一棵樹上找另一棵樹
bool issubTree(BTNode* root, BTNode* subroot) {if (root == NULL)return false;if (root->val == subroot->val&& isSametree(root, subroot)) {//當遍歷時發現根相同時才開始遍歷比較//為了防止不止一處地方根相同且有一處根相同的地方并不完全相等,所以我們需要這兩個條件同時成立才返回true.return true;}//遍歷return issubTree(root->left,subroot) || issubTree(root->right,subroot);
}
這里與其他函數結合可以更好地解決問題。
