地址node
https://www.acwing.com/problem/content/66/ide
https://www.acwing.com/problem/content/67/spa
https://www.acwing.com/problem/content/submission/68/code
三道題都是二叉樹相關 使用遞歸遍歷便可解決blog
70. 二叉搜索樹的第k個結點遞歸
給定一棵二叉搜索樹,請找出其中的第k小的結點。get
你能夠假設樹和k都存在,而且1≤k≤樹的總結點數。it
輸入io
輸入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3 輸出:3
中序遍歷 額外添加了計數Kevent
當遍歷了K個節點 就找到了目標節點
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode* ans; 13 TreeNode* travel(TreeNode* root, int& k) 14 { 15 if(root == NULL) return NULL; 16 17 travel(root->left,k); 18 k--; 19 if(k ==0) ans = root; 20 21 travel(root->right,k); 22 23 24 return NULL; 25 } 26 27 TreeNode* kthNode(TreeNode* root, int k) { 28 travel(root,k); 29 30 return ans; 31 } 32 };
71. 二叉樹的深度
輸入一棵二叉樹的根結點,求該樹的深度。
從根結點到葉結點依次通過的結點(含根、葉結點)造成樹的一條路徑,最長路徑的長度爲樹的深度。
輸入
輸入:二叉樹[8, 12, 2, null, null, 6, 4, null, null, null, null]以下圖所示: 8 / \ 12 2 / \ 6 4 輸出:3
遞歸遍歷 添加層數遍歷
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int ans =0; 13 14 void travel(TreeNode* root,int k){ 15 if(root == NULL){ 16 if(k > ans) 17 ans =k; 18 return; 19 } 20 travel(root->right,k+1); 21 travel(root->left,k+1); 22 23 } 24 25 int treeDepth(TreeNode* root) { 26 if(root == NULL) return 0; 27 travel(root,0); 28 29 30 return ans; 31 } 32 };
72. 平衡二叉樹
輸入一棵二叉樹的根結點,判斷該樹是否是平衡二叉樹。
若是某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
注意:
輸入
輸入:二叉樹[5,7,11,null,null,12,9,null,null,null,null]以下所示, 5 / \ 7 11 / \ 12 9 輸出:true
遞歸遍歷 記錄每一個節點做爲子樹的深度 向上返回左右子樹大的那個深度
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool ans =true; 13 int isBalancedInner(TreeNode* root,int k) 14 { 15 if(root == NULL) return k; 16 17 int l = isBalancedInner(root->left,k+1); 18 int r = isBalancedInner(root->right,k+1); 19 20 if(abs(l-r) > 1) ans =false; 21 22 return max(l,r); 23 } 24 25 bool isBalanced(TreeNode* root) { 26 isBalancedInner(root,0); 27 28 return ans; 29 } 30 };