循环遍历二叉树

前序遍历

struct Node
{
	Node*left;
	Node*right;
	int data;
	Node(){ func; }
};

Node* create(Node*p, int depth)
{
	if (p && depth)
	{
		p->left = new Node;
		p->right = new Node;
		p->data = depth;
		create(p->left, depth - 1);
		create(p->right, depth - 1);

	}
	if (!depth)
	{
		p->left = nullptr;
		p->right = nullptr;
		p->data = depth;

	}

	return p;

}

void print1(Node*p)
{
	if (p)
	{
		cout << p->data << " ";
		print1(p->left);
		print1(p->right);
	}
}

void print2(Node*head)//利用stack 模拟函数调用过程 来遍历
{
	stack<Node* > s;

	Node*p = head;

	{
		while (p)
		{
			s.push(p);
			cout << p->data << " ";
			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();

			if (pp->right && pp != head)
			{
				cout << pp->right->data << " ";
			}
			s.pop();
		}

	}

	{
		p = head->right;

		while (p)
		{
			s.push(p);
			cout << p->data << " ";
			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();

			if (pp->right
				&& pp != head)
			{
				cout << pp->right->data << " ";
			}
			s.pop();
		}

	}

}

int main()
{

	Node* head = new Node;
	create(head, 2);

	head->data = 10;
	head->left->data = 6;
	head->right->data = 14;

	head->left->left->data = 4;
	head->left->right->data = 8;

	head->right->left->data = 12;
	head->right->right->data = 16;

	print1(head);//递归遍历
	cout << endl;
	print2(head);//循环遍历

	system("pause");
	return 0;
}

中序


void print2(Node*head)
{
	stack<Node* > s;

	Node*p = head;

	{
		while (p)
		{
			s.push(p);
		//	cout << p->data << " ";
			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();
			cout << pp->data << " ";

			if (pp->right && pp != head  )
			{

				cout << pp->right->data << " ";
			}
			s.pop();
		}

	}

	{
		p = head->right;

		while (p)
		{
			s.push(p);

			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();
			cout << pp->data << " ";
			if (pp->right&& pp != head)
			{
				cout << pp->right->data << " ";
			}
			s.pop();
		}

	}

}

后序


void print2(Node*head)
{
	stack<Node* > s;

	Node*p = head;

	{
		while (p)
		{
			s.push(p);

			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();
			if (pp->right && pp != head  )
			{

				cout << pp->right->data << " ";
			}
			if ( pp != head)
			cout << pp->data << " ";
			s.pop();
		}

	}

	{
		p = head->right;

		while (p)
		{
			s.push(p);
			p = p->left;
		}

		while (!s.empty())
		{
			Node*pp = s.top();

			if (pp->right&& pp != head)
			{
				cout << pp->right->data << " ";
			}
			cout << pp->data << " ";
			s.pop();
		}

	}
	cout << head->data << " ";
}
时间: 2024-11-19 05:07:11

循环遍历二叉树的相关文章

循环遍历-二叉树

前序遍历 struct Node { Node*left; Node*right; int data; Node(){ func; } }; Node* create(Node*p, int depth) { if (p && depth) { p->left = new Node; p->right = new Node; p->data = depth; create(p->left, depth - 1); create(p->right, depth

3、二叉树:先序,中序,后序循环遍历详解

原创博客,转载请注明出处,谢谢~~~ 设计二叉树的循环遍历算法对于深刻理解二叉树很有帮助.下面就详细分析3个循环遍历算法. 1.先序循环遍历算法. 在自己设计循环遍历算法的时候,感觉先序遍历算法设计最为容易.下面把设计思路写下来,以防遗忘. 先序循环遍历二叉树的思路最为直接,规则就是: ①. 从根结点开始沿着左孩子一直走到头,在此过程中,每到达一个结点便访问其元素值(如,输出),同时检测该结点是否有右孩子,如果有则将指向右孩子的引用入栈: ②. 第一步完成以后,弹出一个栈顶引用作为本次循环的根节

12.遍历二叉树与二叉树的建立

一.遍历二叉树 1.定义 二叉树的遍历(travering binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 2.前序遍历 (1)规则:若二叉树为空,则空操作返回.否则,先访问根结点,然后前序遍历左子树,再前序遍历右子树. (2)实例 前序遍历结果为:A BDGH CEIF 分析:当最先访问根结点后,然后前序遍历左子树.当访问根的左子树时,这里"前序遍历"即我们将B假设为左子树的根来遍历. (3)算法 从二叉树定义

【数据结构】 非递归前中后序遍历二叉树

数据结构学的递归了,深入了解后写一个三序非递归的版本. //测试数据:abd##eg##h##c#f## #include <cstdio> #include <iostream> typedef char ElemType; typedef struct Node { ElemType elem; struct Node *lchild,*rchild; }Node,*BiTree; typedef struct{ BiTree *base; BiTree *top; int s

中序遍历二叉树+O(1)空间

问题描述 中序遍历二叉树时,很简单,需要加上递归就可以优雅地实现了.当然,使用递归的话,函数调用栈的空间就会达到O(log n).那么有什么方式,可以使得中序遍历二叉树的复杂度为O(1)呢? 问题分析 既然要保证O(1)复杂度,那么就不能使用递归调用了.目标方案应该是使用while或for循环的方式.下面借用一张图来解释(来源:http://www.2cto.com/kf/201402/277873.html): 如图所示,需要在多个节点(right指针为空),设置指针指向父节点.这样在遍历的时

层序遍历二叉树

周末要给老师写个期中考试的题解 最后两道题全都是关于二叉树的一些算法 层序遍历二叉树直接输入数据,建立二叉排序树,利用队列层序输出即可,没什么难度 贴下自己的代码 //功能:层序遍历二叉树 //时间:2014-11-23 #include <iostream> #include <queue> using namespace std; //二叉链表数据结构定义 #define TElemType int typedef struct BiTNode{ TElemType data;

(前、中、后)序遍历二叉树的递归、非递归算法!

转至:http://blog.csdn.net/alex44667416/article/details/4723991 package tree; import java.util.Stack; // 二叉树节点 class BTNode { private char key; private BTNode left, right; public BTNode(char key) { //新建一个值为key的结点 this(key, null, null); } public BTNode(c

从上到下遍历二叉树

思路: 即二叉树的层序遍历.可以使用一个辅助队列,首先将二叉树的根节点入队,然后打印根结点的值,接着判断根结点 是否有左右孩子,如果有,将左右孩子入队.如此循环直到队列为空. 代码: /* 从上到下遍历二叉树 by Rowandjj 2014/8/1 */ #include<iostream> using namespace std; typedef struct _BNODE_ { int data; struct _BNODE_ *lChild; struct _BNODE_ *rChil

网易:层次遍历二叉树

题目描述 分层遍历二叉树 用java实现树结构,分层遍历二叉树.给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层单独输出一行),每一层要求访问的顺序为从左到右,再按照相同规则从下至上遍历一遍,树节点定义如下 class Node { int data; Node left; Node right; } 输入描述 图: __1__ / __2__ 3__ / \ 4 __5__ 6 7 8 上面的输入为:1, 2, 3, 4, 5, 0, 6, 0, 0, 7, 8注: