二叉树的非递归遍历

二叉树的非递归遍历,这个实现的是先根遍历

// Traverse-Tree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>      
#include<vector>    


using namespace std;




struct BiNOde
{
	int ele;
	BiNOde* lnode;
	BiNOde* rnode;
};


BiNOde*create_tree()
{
	BiNOde * root = new BiNOde;
	BiNOde*node1 = new BiNOde;
	BiNOde*node2 = new BiNOde;
	BiNOde*node3 = new BiNOde;
	BiNOde*node4 = new BiNOde;
	BiNOde*node5 = new BiNOde;
	BiNOde*node6 = new BiNOde;
	BiNOde*node7 = new BiNOde;
	BiNOde*node8 = new BiNOde;
	BiNOde*node9 = new BiNOde;
	BiNOde*node10 = new BiNOde;
	BiNOde*node11 = new BiNOde;
	root->ele = 0;
	node1->ele = 1;
	node2->ele = 2;
	node3->ele = 3;
	node4->ele = 4;
	node5->ele = 5;
	node6->ele = 6;
	node7->ele = 7;
	node8->ele = 8;
	node9->ele = 9;
	node10->ele = 10;
	node11->ele = 11;
	root->lnode = node1;
	root->rnode = node2;
	node1->lnode = node3;
	node1->rnode = node4;
	node2->lnode = node7;
	node2->rnode = node8;
	node3->lnode = node5;
	node3->rnode = node11;
	node4->lnode = node10;
	node4->rnode = NULL;
	node5->lnode = node6;
	node5->rnode = NULL;
	node6->lnode = NULL;
	node6->rnode = NULL;
	node7->lnode = node9;
	node7->rnode = NULL;
	node8->lnode = NULL;
	node8->rnode = NULL;
	node9->lnode = NULL;
	node9->rnode = NULL;
	node10->lnode = NULL;
	node10->rnode = NULL;
	node11->lnode = NULL;
	node11->rnode = NULL;
	//BiNOde*node12 = new BiNOde;      
	//node12->ele = 12;      
	//node12->lnode = NULL;      
	//node12->rnode = NULL;      
	//node6->lnode = node11;      

	return root;
}


vector<BiNOde*>expand(BiNOde*node)
{
	cout << node->ele << endl;
	
	vector<BiNOde*>aaa;
	while (node != NULL)
	{
		if (node->lnode!=NULL)
		cout << node->lnode->ele << endl;
		if (node->rnode != NULL)
			aaa.push_back(node->rnode);
		node = node->lnode;
	}

	return aaa;
}


void Traverse(BiNOde*root)
{
	vector<vector<BiNOde*>>aa;
	if (root == NULL)
		return;
	vector<BiNOde*>aaa = expand(root);
	if (aaa.empty())
		return;
	aa.push_back(aaa);
	while (!aa.empty())
	{
		while (aa.back().empty())
		{
			aa.pop_back();
			if (aa.empty())
				return;
		}
		BiNOde*n = aa.back().back();
		aa.back().pop_back();
		aaa = expand(n);
		if (!aaa.empty())
		{
			aa.push_back(aaa);
		}

	}
}



int _tmain(int argc, _TCHAR* argv[])
{
	BiNOde*root = create_tree();
	Traverse(root);
	system("pause");
	return 0;
}


你可能感兴趣的:(二叉树,遍历)