遍历二叉树(递归与非递归)
来源:互联网 发布:苏州app软件开发 编辑:程序博客网 时间:2024/05/29 17:13
非递归遍历:
1.申请一个新的栈stack
2.将头结点head压入stack
3.每次从stack中弹出栈顶节点,记为cur,然后点cur的值,如果cur的右孩子不为空,将cur的右孩子先压入stack,最后如果cur的左孩子不为空的话,将cur的左孩子压入stack
4.重复3
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class TreeToSequence {public: vector<vector<int> > convert(TreeNode* root) { vector<vector<int>> save(3); save[0]=xian(root,save[0]); save[1]=zhong(root,save[1]); save[2]=hou(root,save[2]); return save; } vector<int> xian(TreeNode* root,vector<int> &a)//先序遍历 { stack<TreeNode*> p; TreeNode* q; p.push(root); //先让栈顶入栈 while(!p.empty()) { a.push_back(p.top()->val); //打印栈顶元素 q=p.top(); p.pop(); //弹出栈顶元素 if(q->right!=NULL) //栈顶的右节点入栈 { p.push(q->right); } if(q->left!=NULL) { p.push(q->left); //栈顶的左节点入栈 } } return a; } vector<int> zhong(TreeNode* root,vector<int> &a) { stack<TreeNode*> p; TreeNode* q=root; while(q!=NULL||!p.empty()) { if(q!=NULL) //如果做节点不是空,左节点入栈 { p.push(q); q=q->left; //让q等于入栈的节点 } else //如果节点是空的,弹出栈顶节点 { q=p.top(); a.push_back(q->val); p.pop(); q=q->right; } } return a; } vector<int> hou(TreeNode* root,vector<int> &a) { stack<TreeNode*> p; stack<TreeNode*> q; TreeNode* m=root; p.push(root); while(!p.empty()) { m=p.top(); //第一个栈顶元素取出来 p.pop(); //删除栈顶元素 q.push(m); //放入第二个栈中 if(m->left!=NULL) { p.push(m->left); } if(m->right!=NULL) { p.push(m->right); } } int i=0; while(!q.empty()) { m=q.top(); a.push_back(m->val); q.pop(); } return a; }};
递归遍历
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class TreeToSequence {public: vector<vector<int> > convert(TreeNode* root) { vector<vector<int>> save(3); xian(root,save[0]); //先序 zhong(root,save[1]);//中序 hou(root,save[2]);//后序 return save; } void xian(TreeNode* root,vector<int> &a) { if(root==NULL) return ; a.push_back(root->val);//先序遍历,根节点先入栈 xian(root->left,a); xian(root->right,a); } void zhong(TreeNode* root,vector<int> &a) { if(root==NULL) return ; zhong(root->left,a); a.push_back(root->val);//中序遍历,根节点中间入栈 zhong(root->right,a); } void hou(TreeNode* root,vector<int> &a) { if(root==NULL) return ; hou(root->left,a); hou(root->right,a); a.push_back(root->val);//后序遍历,根节点后入栈 } };
阅读全文
0 0
- 二叉树 递归 与 非递归 遍历
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 遍历二叉树(递归与非递归)
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉查找树递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树递归遍历与非递归遍历
- 二叉树递归遍历与非递归遍历(终极版)
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- MVG读书笔记——三维空间中的射影几何(二)
- 启明之星
- Python爬取天气预报数据,并存入到本地EXCEL中
- mybatis-自动生成mapper接口实现类
- [扩展kmp] hdu6153 A Secret
- 遍历二叉树(递归与非递归)
- android malware
- PS入门-02-椭圆选择框基础操作
- Personal programming language Gym
- TCP的拥塞控制原理
- ubuntu16.04 opencv多版本管理与切换
- pyqt5入门—002—信号、槽
- Codeforces 845 B Luba And The Ticket
- 看涨吞没