1. 程式人生 > >資料結構-從底向上層次遍歷二叉樹

資料結構-從底向上層次遍歷二叉樹

【題目來自灰灰考研】

二叉樹採用二叉連結串列進行儲存(如下所示),每個結點包含資料域Data,左孩子指標域left和右孩子指標域right。請設計演算法給定一顆樹,返回其節點值從底向上的層次序遍歷(按從葉節點所在層到根節點所在的層遍歷,然後逐層從左往右遍歷)。

Typedef struct BitNode{   

TElemType data;  

      struct BitNode *left, *right;

} *BiTree ;

樣例

給出一棵二叉樹 {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

按照從下往上的層次遍歷為:

[ 
  [15,7],
  [9,20],
  [3]
]
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define MAXSIZE 20
using namespace std;

typedef struct TNode{
	char data;
	struct TNode *lChild, *rChild;
}TNode;

TNode *createBTree()
{
	//124##57###38#9###
	TNode *node;
	char data;
	cin>>data;
	if(data == '#')
		return NULL;
	else
	{
		node = (TNode*)malloc(sizeof(TNode));
		node->data = data;
		node->lChild = createBTree();
		node->rChild = createBTree();
	}
	return node;
}


void reverseLevelVisit(TNode *root)
{
	/*
		使用層次遍歷+棧就可以了
		但是注意一點,在正常層序遍歷的時候
		當遍歷到一個節點時,首先將該節點壓入棧中
			如果其有右孩子節點,先將其右節點入佇列, 
			如果有左孩子節點,再將其左孩子節點入棧,一定不能搞反了
			因為只有這樣出棧的時候才是從左到右訪問的 
		 
	*/
	int front = 0, rear = 0;
	TNode *queue[MAXSIZE], *p;
	TNode *stack[MAXSIZE];
	int top = -1;
	rear = (rear + 1) % MAXSIZE;
	queue[rear] = root;
	while(rear != front)
	{
		front = (front + 1) % MAXSIZE;
		p = queue[front];
		stack[++top] = p;
		if(p->rChild)
		{
			rear = (rear + 1) % MAXSIZE;
			queue[rear] = p->rChild;
		}
		if(p->lChild)
		{
			rear = (rear + 1) % MAXSIZE;
			queue[rear] = p->lChild;
		}	
	}
	while(top != -1)
	{
		p = stack[top--];
		cout<<p->data<<" ";
	}
	cout<<endl;
}

int main()
{
	TNode *root;
	root = createBTree();
	reverseLevelVisit(root);
	return 0;
}