递归及非递归二叉树遍历方法
2017-10-11 19:59
106 查看
三种递归遍历
//前序遍历 void preorder(TreeNode *root, vector<int> &path) { if(root != NULL) { path.push_back(root->val); preorder(root->left, path); preorder(root->right, path); } }
//中序遍历 void inorder(TreeNode *root, vector<int> &path) { if(root != NULL) { inorder(root->left, path); path.push_back(root->val); inorder(root->right, path); } }
//后续遍历 void postorder(TreeNode *root, vector<int> &path) { if(root != NULL) { postorder(root->left, path); postorder(root->right, path); path.push_back(root->val); } }
教科书上的非递归方法
//非递归前序遍历 void preorderTraversal(TreeNode *root, vector<int> &path) { stack<TreeNode *> s; TreeNode *p = root; while(p != NULL || !s.empty()) { while(p != NULL) { path.push_back(p->val); s.push(p); p = p->left; } if(!s.empty()) { p = s.top(); s.pop(); p = p->right; } } }
//非递归中序遍历 void inorderTraversal(TreeNode *root, vector<int> &path) { stack<TreeNode *> s; TreeNode *p = root; while(p != NULL || !s.empty()) { while(p != NULL) { s.push(p); p = p->left; } if(!s.empty()) { p = s.top(); path.push_back(p->val); s.pop(); p = p->right; } } }
//非递归后序遍历-迭代 void postorderTraversal(TreeNode *root, vector<int> &path) { stack<TempNode *> s; TreeNode *p = root; TempNode *temp; while(p != NULL || !s.empty()) { while(p != NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点 { TreeNode *tempNode = new TreeNode; tempNode->btnode = p; tempNode->isFirst = true; s.push(tempNode); p = p->left; } if(!s.empty()) { temp = s.top(); s.pop(); if(temp->isFirst == true) //表示是第一次出现在栈顶 { temp->isFirst = false; s.push(temp); p = temp->btnode->right; } else //第二次出现在栈顶 { path.push_back(temp->btnode->val); p = NULL; } } } }
简化统一格式的非递归算法
//更简单的非递归前序遍历 void preorderTraversalNew(TreeNode *root, vector<int> &path) { stack< pair<TreeNode *, bool> > s; s.push(make_pair(root, false)); bool visited; while(!s.empty()) { root = s.top().first; visited = s.top().second; s.pop(); if(root == NULL) continue; if(visited) { path.push_back(root->val); } else { s.push(make_pair(root->right, false)); s.push(make_pair(root->left, false)); s.push(make_pair(root, true)); } } }
//更简单的非递归中序遍历 void inorderTraversalNew(TreeNode *root, vector<int> &path) { stack< pair<TreeNode *, bool> > s; s.push(make_pair(root, false)); bool visited; while(!s.empty()) { root = s.top().first; visited = s.top().second; s.pop(); if(root == NULL) continue; if(visited) { path.push_back(root->val); } else { s.push(make_pair(root->right, false)); s.push(make_pair(root, true)); s.push(make_pair(root->left, false)); } } }
//更简单的非递归后序遍历 void postorderTraversalNew(TreeNode *root, vector<int> &path) { stack< pair<TreeNode *, bool> > s; s.push(make_pair(root, false)); bool visited; while(!s.empty()) { root = s.top().first; visited = s.top().second; s.pop(); if(root == NULL) continue; if(visited) { path.push_back(root->val); } else { s.push(make_pair(root, true)); s.push(make_pair(root->right, false)); s.push(make_pair(root->left, false)); } } }
转载自链接:http://www.jianshu.com/p/49c8cfd07410
相关文章推荐
- 用递归和非递归的方法来求斐波那契数列
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- c# 查找文件夹的方法(递归)
- 二叉树前序、中序和后序的遍历方法(递归、用栈和使用线索化)
- 二叉树(2)二叉树创建的3种方法,二叉树的递归遍历,二叉树的销毁
- 用递归的方法判断一个数组是否为递增数组
- php7基于递归实现删除空文件夹的方法示例
- 【Java】斐波那契数列(Fibonacci Sequence、兔子数列)的3种计算方法(递归实现、递归值缓存实现、循环实现、尾递归实现)
- 在Linux系统下递归删除文件或目录的方法
- Leetcode 101. Symmetric Tree 判断二叉树是否对称,注意写在两个方法中,递归时注意空的判断
- 先序,中序,后序,求叶子结点数,深度,拷贝,几种二叉树的常见递归使用方法
- 第4周项目5-用递归方法求解(2)
- 主方法和递归树、复杂度分析
- Java之递归求和的两种简单方法(推荐)
- java递归方法
- 直接插入排序(递归与非递归2种实现方法)
- 二叉树的三种遍历方法(递归)
- C语言经典算法(九)——递归实现二分查找的两种方法
- Java遍历文件夹的两种方法(非递归和递归) .
- 使用递归方法获得TreeView中CheckBox选中的节点