现在的位置: 首页 > 综合 > 正文

算法习题43:递归和非递归实现二叉树的前序遍历

2013年08月26日 ⁄ 综合 ⁄ 共 2131字 ⁄ 字号 评论关闭

.递归和非递归俩种方法实现二叉树的前序遍

------------------------------------------------

递归的替换我们很容易就想到,肯定是借助循环,可是我们这里递归二叉树的时候其实是借助编译器内部的栈来实现存储打印的,从而具有记忆功能,

而现在如果只用循环,这种记忆功能将不存在,所以我们需要利用一个辅助队列来实现

那么这个过程就简单多了,比如下面一棵树

                   9

               6     11

           3   8  10  15

         1   7

            2


我们先往队列(就是一个链表结构)里放入根元素

然后遍历左右子树有则加入

9 6 11

接下来遍历6,左右子树加入

9 6 3 8 11

然后遍历3.以此类推 结果就出来了 打印队列


同理,如果要中序遍历呢?这里需要在LinkNode这个结构体里加入一个变量,表示是否已经被访问过,这个大家可以考虑下,只是这个时候节点加入是在节点左右加入 先加入左子树,再加入自己,然后才是右子树

例如上例子

先访问根9,则链表成: 6  9(标记以被访问) 11

然后访问6,则链表成: 3  6  8  9  11

访问3,则  1  3  6  8  9  11 

访问1,则  1  2  3  6  8  9  11

访问2,则  1  2  3  6  8  9  11

访问8,则  1   2  3  6  7  8  9  11.。。

以此类推结果同上


//============================================================================
// Name        : BTreeMLR.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

struct Node{
	int value;
	Node* left;
	Node* right;
};

struct LinkNode{
	Node* node;
	LinkNode* next;
};

class BTree{
private:
	Node* root;

	void Add(Node* &p, int value){
		if(p == NULL){
			Node* temp = new Node();
			temp->value = value;
			temp->left = NULL;
			temp->right = NULL;
			p = temp;
			return ;
		}
		if(value < p->value)
			Add(p->left, value);
		else if(value > p->value)
			Add(p->right, value);
	}

	void MLR(Node* p){
		if(p == NULL)
			return;
		cout<<p->value<<" ";
		MLR(p->left);
		MLR(p->right);
	}

public:
	BTree(){
		root = NULL;
	}

	void Add(int value){
		Add(root, value);
	}

	void MLR(){
		MLR(root);
	}

	void MLR2(){
		//用一个链表记录左右子树实现
		Node* child = root;

		if(root == NULL)
			return;
		LinkNode* head = new LinkNode();
		head->node = root;
		head->next = NULL;

		LinkNode* current = head;

		while(current != NULL){
			LinkNode* p = current;
			LinkNode* temp = current->next;

			child = current->node;
			if(child->left != NULL){
				LinkNode* newNode = new LinkNode();
				newNode->next = NULL;
				newNode->node = child->left;

				p->next = newNode;
				p = p->next;
			}
			if(child->right != NULL){
				LinkNode* newNode = new LinkNode();
				newNode->next = NULL;
				newNode->node = child->right;

				p->next = newNode;
				p = p->next;
			}
			p->next = temp;
			current = current->next;
		}

		while(head != NULL){
			cout<<head->node->value<<" ";
			head = head->next;
		}

	}

};
int main() {

	BTree* bTree = new BTree();
	int input = 0;
	while(true){
		cin>>input;
		if(input!=-1)
			bTree->Add(input);
		else break;
	}

	bTree->MLR();
	cout<<endl;
	bTree->MLR2();
	return 0;
}

9 6 11 10 15 3 8 1 7 2 -1
9 6 3 1 2 8 7 11 10 15 
9 6 3 1 2 8 7 11 10 15 

抱歉!评论已关闭.