一、給定二叉樹,找到它的最小深度。最小深度是從根節點到最近葉節點的最短路徑上的節點數。函數
class Solution { public: int run(TreeNode *root) { if(!root) return 0; queue<TreeNode*> qu; TreeNode *last; TreeNode *now; int level=1; int size; last = now = root; qu.push(root); while(qu.size()){ now = qu.front(); qu.pop(); size = qu.size(); if(now->left) qu.push(now->left); if(now->right) qu.push(now->right); if(qu.size()-size ==0) break; if(last == now){ level++; if(qu.size()) last = qu.back(); } } return level; } };
二、給定二叉樹,返回其節點值的後序遍歷。post
例如:
給定二叉樹{1,#,2,3},spa
1
\
2
/
3指針
返回[3,2,1]。code
注意:遞歸解決方案很簡單,你能夠迭代地作嗎?blog
思路:遞歸
前序遍歷 根->左->右 變成 根->右->左 結果再reverse一下it
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int> res; if(!root) return res; stack<TreeNode *> st; st.push(root); while(st.size()){ TreeNode *temp = st.top(); st.pop(); res.push_back(temp->val); if(temp->left) st.push(temp->left); if(temp->right) st.push(temp->right); } reverse(res.begin(),res.end()); return res; } };
三、給定二叉樹,返回其節點值的前序遍歷。io
例如:
給定二叉樹{1,#,2,3},ast
1
\
2
/
3
返回[1,2,3]。
注意:遞歸解決方案很簡單,你能夠迭代地作嗎?
思路:
非遞歸方式求前序遍歷
首先找根節點的左孩子,若是有則放入開闢好的棧裏,若沒有則找他的右孩子,
若此時沒有其右孩子,則返回它的父節點,觀察其是否有右兄弟,以此類推
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> res; if(!root) return res; stack<TreeNode*> st; TreeNode *p = root; while(!st.empty() || p!=NULL){ if(p!=NULL){ //若是有左孩子 res.push_back(p->val); //將值放入到開闢好的容器中 st.push(p); //將其放入棧中 p = p->left; //繼續找左孩子 }else{ p = st.top(); //找到當前棧中的最上層的節點 st.pop(); //刪除該節點 p = p->right; // 看這個節點是由由右孩子 } } return res; } };
四、給定包含從0到9的數字的二叉樹,每一個根到葉路徑能夠表示數字。
一個例子是root-to-leaf path1-> 2-> 3,它表明數字123。
找到全部根到葉數的總和。
例如,
1
/ \
2 3
root-to-leaf path1-> 2表示數字12。
root-to-leaf path1-> 3表示數字13。
返回總和= 12 + 13 = 25。
思路:
先序遍歷的思想(根左右)+數字求和(每一層都比上層和*10+當前根節點的值)
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int sumNumbers(TreeNode *root) { int sum=0; if(root==NULL) return sum; return preOrdersumNumber(root,sum); } int preOrdersumNumber(TreeNode *root,int sum){ if(root==0) return 0; sum = sum*10+root->val; if(root->left==NULL && root->right==NULL){ return sum; } return preOrdersumNumber(root->left,sum)+preOrdersumNumber(root->right,sum); } };
五、跟進問題「在每一個節點中填充下一個右指針」。
若是給定的樹能夠是任何二叉樹怎麼辦? 您之前的解決方案是否仍然可行
注意:
您可能只使用恆定的額外空間。
例如,
鑑於如下二叉樹,
1
/ \
2 3
/ \ \
4 5 7
調用函數後,樹應該以下所示:
1 - > NULL
/ \
2 - > 3 - > NULL
/ \ \
4-> 5 - > 7 - > NULL
思路:
若是當前層全部結點的next 指針已經設置好了,那麼據此,下一層全部結點的next指針 也能夠依次被設置。
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */ class Solution { public: void connect(TreeLinkNode *root) { while(root){ TreeLinkNode *dummy = new TreeLinkNode(-1); TreeLinkNode *start; start = dummy; for(auto p=root;p;p=p->next){ if(p->left){ start->next = p->left; start = start->next; } if(p->right){ start->next = p->right; start = start->next;; } } root = dummy->next; } } };
六、給出一棵二叉樹
struct TreeLinkNode {
TreeLinkNode * left;
TreeLinkNode *權利;
TreeLinkNode * next;
}
填充每一個下一個指針以指向其下一個右側節點。 若是沒有下一個右節點,則應將下一個指針設置爲NULL。
最初,全部下一個指針都設置爲NULL。
注意:
您可能只使用恆定的額外空間。
您能夠假設它是一個完美的二叉樹(即,全部葉子都處於同一級別,而且每一個父級都有兩個子級)。
例如,
鑑於如下完美的二叉樹,
1
/ \
2 3
/ \ / \
4 5 6 7
調用函數後,樹應該以下所示:
1 - > NULL
/ \
2 - > 3 - > NULL
/ \ / \
4-> 5-> 6-> 7 - > NULL
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */ class Solution { public: void connect(TreeLinkNode *root) { while(root){ TreeLinkNode *dummy = new TreeLinkNode(-1); TreeLinkNode *start; start = dummy; for(auto p=root;p;p=p->next){ if(p->left){ start->next = p->left; start = start->next; } if(p->right){ start->next = p->right; start = start->next;; } } root = dummy->next; } } };
八、給定二叉樹和求和,找到全部根到葉路徑,其中每一個路徑的總和等於給定的總和。
例如:
給出下面的二叉樹andsum = 22,
五
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回
[
[5,4,11,2]
[5,8,4,5]
]
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > pathSum(TreeNode *root, int sum) { vector<vector<int> > num; vector<int> array; pathSum(root,sum,array,num); return num; } void pathSum(TreeNode *root, int sum,vector<int> array,vector<vector<int> >& num){ if(root==NULL) return; array.push_back(root->val); if(root->left==NULL && root->right==NULL && sum-root->val==0){ num.push_back(array); } pathSum(root->left,sum-root->val,array,num); pathSum(root->right,sum-root->val,array,num); } };
九、給定二叉樹和求和,肯定樹是否具備根到葉路徑,使得沿路徑的全部值相加等於給定的總和。
例如:
給出下面的二叉樹andsum = 22,
五
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回true,由於存在根到葉的路徑5-> 4-> 11-> 2,其中和爲22。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool hasPathSum(TreeNode *root, int sum) { if(root==NULL) return false; if(root->left==NULL && root->right==NULL && sum-root->val==0){ return true; } return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val); } };