2.3.4 树
遍历:前中后序,宽度优先。
二叉树的特例:二叉搜索树、堆(最大堆和最小堆,用于找最值)、红黑树(c++ STL中的很多数据结果就是基于这实现的);
题7-重建二叉树:递归,设置四个位点;
1 class Solution { 2 public: 3 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { 4 if(pre.size()!=vin.size()||vin.size()==0) return nullptr; 5 return Construct(0,pre.size()-1,0,vin.size()-1,pre,vin); 6 } 7 8 TreeNode* Construct(int prestart,int preend,int vinstart,int vinend,const vector<int> &pre,const vector<int> &vin){ 9 if(prestart>preend) return nullptr; 10 TreeNode* root=new TreeNode(pre[prestart]); 11 for(int i=vinstart;i<=vinend;i++) 12 if(pre[prestart]==vin[i]){ 13 root->left=Construct(prestart+1,prestart+i-vinstart,vinstart,i-1,pre,vin); 14 root->right=Construct(prestart+i-vinstart+1,preend,i+1,vinend,pre,vin); 15 break; 16 } 17 return root; 18 } 19 };
题8-二叉树的下一个节点
1 class Solution { 2 public: 3 TreeLinkNode* GetNext(TreeLinkNode* pNode) 4 { 5 if(pNode==nullptr) return nullptr; 6 if(pNode->right!=nullptr){ 7 pNode=pNode->right; 8 while(pNode->left!=nullptr){ 9 pNode=pNode->left; 10 } 11 return pNode; 12 } 13 else{ 14 if(pNode->next==nullptr) 15 return nullptr; 16 else{ 17 if(pNode==pNode->next->left) 18 return pNode->next; 19 else{ 20 while(pNode->next!=nullptr){ 21 if(pNode==pNode->next->left) 22 return pNode->next; 23 pNode=pNode->next; 24 } 25 return nullptr; 26 } 27 } 28 } 29 } 30 };