非递归实现遍历二叉树

非递归实现二叉树主要利用queue和stack的特点,对于层次遍历二叉树主要运用queue队头出,队尾插入,先进先出的特点,先将根插入队尾,然后输出队头的元素,同时将队头的左子树和右子树元素插入队尾,依次输出输出队头的元素,同时将队头的左子树和右子树元素插入队尾,直到队列为空。

void levelorder()

{

queue<BinaryTreeNode<T> *>s;

if (_root == NULL)

return;

s.push(_root);

while (!s.empty())

{

BinaryTreeNode<T> *front=s.front();

cout << front->_data << " ";

if (front->_left)

s.push(front->_left);

if (front->_right)

s.push(front->_right);

s.pop();

}

}

非递归实现二叉树前序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,再将栈底元素弹出栈,再判断栈底最后一个元素的右子树,利用以上的方法。代码如下:

void prevorder()

{

stack<BinaryTreeNode<T> *>s;

if (_root == NULL)

return;

s.push(_root);

while (!s.empty())

{

BinaryTreeNode<T> *cur = s.top();

cout << cur->_data << " ";

s.pop();

if (cur->_right)

s.push(cur->_right);

if (cur->_left)

s.push(cur->_left);

}

}

非递归实现二叉树中序遍历主要运用stack的先进后出的特点,先把根压入栈里,同时先把左子树的左子树元素以此压入栈底,最后左子树的最后一个元素压入栈底之后,判断栈底最后一个元素的右子树,利用以上的方法。代码如下:

void inorder()

{

stack<BinaryTreeNode<T> *>s;

if (_root == NULL)

return;

BinaryTreeNode<T> *cur = _root;

while (cur||!s.empty())

{

while (cur)

{

s.push(cur);

cur = cur->_left;

}

cout << s.top()->_data << " ";

cur = s.top()->_right;

s.pop();

}

}

非递归实现二叉树后序遍历主要运用stack的先进后出的特点,在利用前序和后序的共同特点

void postorder()

{

stack<BinaryTreeNode<T> *>s;

if (_root == NULL)

return;

BinaryTreeNode<T> *cur = _root;

BinaryTreeNode<T> *prev = NULL;

s.push(cur);

while (cur || !s.empty())

{

while (cur->_left&&cur->_left!=prev)

{

s.push(cur->_left);

cur = cur->_left;

}

if (s.top()->_right&&s.top()->_right != prev)

{

cur = s.top()->_right;

s.push(cur);

}

else

{

cout << s.top()->_data << " ";

prev = s.top();

s.pop();

cur = s.top();

cur->_left =NULL;

}

}

}

时间: 2024-12-11 19:20:02

非递归实现遍历二叉树的相关文章

非递归前序遍历二叉树

#include<stdio.h> #include<stdlib.h> //定义结构体 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiNode,* pBiNode; pBiNode stack[100]; void later(pBiNode * p) //前序创建树 { char ch; scanf("%c",&ch); if(ch=='#') *p=NU

非递归方式遍历二叉树

/** * 非递归方式的先根序 * @param root */ public static void preOrder(Node root){ Stack<Node> stack = new Stack<Node>(); while (!stack.isEmpty() || root != null) { while (root != null) { System.out.println(root.data); stack.push(root); root = root.left

【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】

[144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,2,3]. Note: Recursive solution

二叉树遍历(递归、非递归,层次遍历(从上往下))

递归算法 void preorder1(Node *root) //递归前序遍历 { if (root == NULL) return; printf("%d ", root->val); preorder1(root->left); preorder1(root->right); } void inorder1(Node *root) //递归中序遍历 { if (root == NULL) return; inorder1(root->left); prin

用递归方式遍历二叉树

问题 思路说明 遍历二叉树的方法有广度优先和深度优先两类,下面阐述的是深度优先. 以下图的二叉树为例: 先定义三个符号标记: 访问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 有四种方式: 前序遍历(PreorderTraversal,NLR):先访问根结点,然后遍历其左右子树 中序遍历(InorderTraversal,LNR):先访问左子树,然后访问根节点,再访问右子树 后序遍历(PostorderTraversal,LRN):先访问左右子树,再访问根结点 层序遍历(l

二叉树非递归后缀遍历

二叉树的遍历方法可分为深度优先和广度优先两种.当中深度优先遍历适合使用栈来辅助实现.广度优先则使用队列.由于栈的先进后出和队列的先进先出特点正好符合遍历顺序的要求. 深度优先遍历一般又分为前序遍历,中序遍历.后序遍历,对于一颗树来说,前序.中序.后序针对的都是它的根节点.当中前序遍历訪问顺序是:根节点-->左节点-->右节点,中序遍历訪问顺序是:左节点-->根节点-->右节点,兴许遍历訪问顺序是:左节点-->右节点-->根节点.二叉树的结构是递归的,因此非常适合使用递归

二叉树的建立、三种(递归、非递归)遍历方法

二叉树定义: 1.有且仅有一个特定的称之为根root的结点 2.当n>1时,除根结点之外的其余结点分为两个互不相交的子集.他们称为二叉树的左子树和右子树. 二叉树的一种建立方法: 若对有n个结点的完全二叉树进行顺序编号(1<=i<=n),那么,对于编号为i(i>=1)的结点. 当i=1时,该结点为根,它无双亲结点; 当i>1时,该节点的双亲编号为[i/2]; 若2i<=n,该结点为编号为2i的左孩子,否则没有左孩子 当2i+1<=n,该结点有编号为2i+1的右孩子

数据结构 递归和非递归方式实现二叉树先序、中序和后序遍历

二叉树的先序遍历顺序是根.左.右:中序遍历顺序是左.根.右:后序遍历顺序是左.右.根. 递归方式实现如下: 1 public class TreeNode { 2 private int value; 3 private TreeNode left, right; 4 5 public TreeNode(int data) { 6 value = data; 7 } 8 9 // 递归方式实现先序遍历 10 public void preorder(TreeNode treeNode) { 11

二叉树的几种递归和非递归式遍历:

#include <fstream>#include <iostream> using namespace std; /* 后序遍历的非递归实现是三种遍历方式中最难的一种.因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题.下面介绍两种思路. 第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还为被访问.所以接下来