非递归实现二叉树的后序遍历、前序遍历、中序遍历
2017-10-16 17:15
543 查看
树的遍历可以用递归实现,一般情况下,能用递归解决的问题都可以用栈解决。
对于后续遍历,在父节点出栈时,需要判断左右孩子是否已经遍历过。可以定义一个新的结构体用于记录结点的左右孩子是否遍历过。
对于后续遍历,在父节点出栈时,需要判断左右孩子是否已经遍历过。可以定义一个新的结构体用于记录结点的左右孩子是否遍历过。
vector<int> postOrder(TreeNode *root)//后序遍历 { vector<int> res; if (root == NULL) return res; TreeNode *p = root; stack<TreeNode *> sta; TreeNode *last = root; sta.push(p); while (!sta.empty()) { p = sta.top(); if ((p->left == NULL && p->right == NULL) || (p->right == NULL && last == p->left) || (last == p->right)) { res.push_back(p->val); last = p; sta.pop(); } else { if (p->right) sta.push(p->right); if (p->left) sta.push(p->left); } } return res; } void preOrder_stack(Node root) {//先序遍历 Stack<Node> stack = new Stack<Node>(); Node node = root; while (node|| !stack.empty()){//左孩子压栈 while (node) {//压栈之前先访问 printNode(node); stack.push(node); node = node.getLeftNode(); } if(!stack.empty()) { node = stack.pop(); node = node.getRightNode(); } } } void inOrder_Stack(Node root) {//中序遍历 Stack<Node> stack = new Stack<Node>(); Node node = root; while (node || !stack.empty()) { while (node) { stack.push(node);//直接压栈 node = node.getLeftNode(); } if (!stack.empty()) { node = stack.pop();//出栈并访问 printNode(node); node = node.getRightNode(); } } }
相关文章推荐
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树基础之前序遍历、中序遍历、后序遍历的递归和非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树先序遍历,中序遍历和后序遍历的非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 面试题 二叉树的前序遍历,中序遍历,后序遍历(递归实现)
- 树的遍历实现,前序遍历,中序遍历,后序遍历以及层次遍历的迭代与递归实现
- c之二叉树链表操作---建立、(递归)前序遍历、中序遍历、后序遍历
- 二叉树经典面试题解析一:用非递归实现二叉树的前序遍历,中序遍历,后序遍历
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)