acwing 70-72 劍指OFFER 二叉樹相關

地址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 };
View Code

 

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 };
View Code

 

 

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 };
View Code
相關文章
相關標籤/搜索