voidConstructBinTree(vector<int>&nodes,TreeNode*root){if(nodes.size()==0||nodes[0]==INT_MAX){root=nullptr;return;}queue<TreeNode*>iq;intid=0;root->val=nodes[id++];iq.emplace(root);while(!iq.empty()&&id<nodes.size()){TreeNode*node=iq.front();iq.pop();// check vectors for left node
if(nodes[id]!=INT_MAX){TreeNode*leftNode=newTreeNode;leftNode->val=nodes[id];node->left=leftNode;iq.emplace(leftNode);}else{node->left=nullptr;}id++;// add right node
if(nodes[id]!=INT_MAX){TreeNode*rightNode=newTreeNode;rightNode->val=nodes[id];node->right=rightNode;iq.emplace(rightNode);}else{node->right=nullptr;}id++;}return;}
voidScanBinMiddle(TreeNode*tree){if(tree==nullptr){return;}// handle value
cout<<tree->val<<" ";if(tree->left){ScanBinMiddle(tree->left);}if(tree->right){ScanBinMiddle(tree->right);}}
// CPP program to illustrate
// Application of push() and pop() function
#include<iostream>#include<queue>usingnamespacestd;intmain(){intc=0;// Empty Queue
queue<int>myqueue;myqueue.push(5);myqueue.push(13);myqueue.push(0);myqueue.push(9);myqueue.push(4);// queue becomes 5, 13, 0, 9, 4
// Counting number of elements in queue
while(!myqueue.empty()){myqueue.pop();c++;}cout<<c;}
vector<int>rightSideView(TreeNode*root){vector<int>rlt;// empty rlt for empty tree
if(root==nullptr){returnrlt;}queue<TreeNode*>qu;qu.push(root);while(!qu.empty()){intqz=qu.size();// add the last node in the current queue
rlt.emplace_back(qu.back()->val);// add nodes of next layer into the queue
for(inti=0;i<qz;i++){TreeNode*node=qu.front();qu.pop();if(node->left){qu.push(node->left);}if(node->right){qu.push(node->right);}}}returnrlt;}
3.2 二叉树中所有距离为 K 的结点
题目见863. 二叉树中所有距离为 K 的结点 - 力扣(LeetCode),这道题稍微有点复杂,观察给出的例子(如下图),与5的节点距离为2的节点除了4和7之外还有1,如果仅仅给出4和7是比较简单的,只要以5为根节点,记录depth = 1,套用引子中的程序,将depth = K + 1的所有的节点列出来即可。
vector<int>distanceK(TreeNode*root,TreeNode*target,intK){unordered_map<TreeNode*,TreeNode*>umap;vector<int>rlt;if(root==nullptr||target==nullptr){returnrlt;}/************ PART 1 ************/// find the father node of all the nodes in the tree
queue<TreeNode*>qu;umap[root]=nullptr;qu.push(root);while(!qu.empty()){intqz=qu.size();for(inti=0;i<qz;i++){TreeNode*node=qu.front();qu.pop();if(node->left){qu.push(node->left);// father node
umap[node->left]=node;}if(node->right){qu.push(node->right);// father node
umap[node->right]=node;}}}/************ PART 2 ************/// find the node with depth of K
queue<TreeNode*>newQ;intdepth=0;unordered_map<TreeNode*,bool>usedmap;usedmap[target]=true;newQ.emplace(target);while(!newQ.empty()&&depth<=K){intqz=newQ.size();for(inti=0;i<qz;i++){TreeNode*node=newQ.front();usedmap[node]=true;newQ.pop();if(depth==K){rlt.emplace_back(node->val);continue;}if(node->left&&(usedmap.count(node->left)==0)){newQ.push(node->left);}if(node->right&&(usedmap.count(node->right)==0)){newQ.push(node->right);}if(umap[node]!=nullptr&&(usedmap.count(umap[node])==0)){newQ.push(umap[node]);}}depth++;}//BFS for final rlt
returnrlt;}