标签:队列 node 树的遍历 span 递归 移除 ast visit else
1 void PreOrder(TreeNode* root) 2 { 3 stack<TreeNode*> s; 4 TreeNode *p=root,*last_visit=NULL; 5 while(p||s.size()>0) 6 { 7 if(p)//走到最左 边走边访问 并进栈 8 { 9 cout<<p->val<<endl; 10 s.push(p); 11 p=p->left; 12 } 13 else//左边没有节点了 14 { 15 p=s.top();//弹出上一个节点 16 s.pop(); 17 p=p->right;//转向右子树 18 } 19 } 20 }
void InOrder(TreeNode* root) { stack<TreeNode*> s; TreeNode *p=root,*last_visit=NULL; while(p||s.size()>0) { if(p)//走到最左 { s.push(p); p=p->left; } else//左边没有节点了 { p=s.top();//弹出上一个节点 s.pop(); cout<<p->val<<endl;//访问栈中弹出的节点 p=p->right;//转向右子树 } } }
1 void PostOrder(TreeNode* root) 2 { 3 stack<TreeNode*> s; 4 TreeNode *p=root,*last_visit=NULL;//last_visit指针记录上次访问过的值,因为后根序 根节点最后访问 所以未访问根节点时 根节点还未退栈 所以需要判别右子树是否访问过 5 while(p||s.size()>0) 6 { 7 if(p)//走到最左 8 { 9 s.push(p); 10 p=p->left; 11 } 12 else//左边没有节点了 13 { 14 p=s.top();//弹出上一个节点 15 if(p->right&&p->right!=last_visit)//若上一个节点存在右子树 且 未被访问过 则转向右子树 16 { 17 s.push(p->right);//右子树进栈 18 p=p->right->left;//再转向右子树的左子树 19 } 20 else//p的左右子树都不存在才进行访问 21 { 22 last_visit=s.top();//记录下来本节点已经访问过了 23 cout<<s.top()->val<<endl; 24 s.pop();//将访问过的节点退栈 25 p=NULL;//指针指向空 下次进来判断栈内下一个元素 26 } 27 } 28 } 29 }
1 void LevelOrder(TreeNode * root) 2 { 3 queue<TreeNode*> que;//队列 4 TreeNode* p; 5 que.push(root);//先将根节点放入队列 6 while(!que.empty())//队列不空 7 { 8 p=que.front();//取出队头结点 9 cout<<p->val<<endl;//访问队头结点 10 que.pop();//将队头结点从队列中移除 11 if(p->left)//若p存在左子树 12 que.push(p->left); 13 if(p->right)//若p存在左子树 14 que.push(p->right); 15 } 16 }
标签:队列 node 树的遍历 span 递归 移除 ast visit else
原文地址:https://www.cnblogs.com/lancelee98/p/11647662.html