關於二叉樹

1、二叉樹的建立

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct BTNode{
	char data;
	struct BTNode *lchild;
	struct BTNode *rchild;
}BTNode;

void createBTree(BTNode *&root)
{
	char c;
    cin>>c;
	fflush(stdin);
	if(c=='#')
	{
		root=NULL;
	}
	else
	{
		root=(BTNode *)malloc(sizeof(BTNode));
		root->data=c;
		cout<<"please print the left child"<<endl;
		createBTree(root->lchild);
		cout<<"please print the right child"<<endl;
		createBTree(root->rchild);
	}
}

int main()
{
	BTNode *root;
	createBTree(root);
}

2、二叉樹的先序中序後序遞歸遍歷

//二叉樹的先序遞歸遍歷
void  preorderRaversal(BTNode *root)
{
	if(root)
	{
		cout<<root->data<<" ";
		preorderRaversal(root->lchild);
		preorderRaversal(root->rchild);
	}
}

//二叉樹的中序遞歸遍歷
void inorderRaversal(BTNode *root)
{
	if(root)
	{
		inorderRaversal(root->lchild);
		cout<<root->data<<" ";
		inorderRaversal(root->rchild);
	}
}

//二叉樹的後續遞歸遍歷
void postorderRaversal(BTNode *root)
{
	if(root)
	{
		postorderRaversal(root->lchild);
		postorderRaversal(root->rchild);
		cout<<root->data<<" ";
	}
}

3、二叉樹的遞歸求深

int getDepth(BTNode *root)
{
	int LD,RD;
	if(!root)
		return 0;
	else
	{
		LD=getDepth(root->lchild);
		RD=getDepth(root->rchild);
		return (LD>RD ? LD:RD)+1;
	}
}

4、二叉樹的先序非遞歸遍歷

   對任一節點p

   1)訪問p節點,並將p節點入棧

   2)判斷p節點的左孩子是否爲空,若爲空,則取棧頂節點並進行出棧操作,並將p右孩子置爲當前的節點p,循環至1),若不爲空,則將p的左孩子置爲p

   3)直到p爲NULL,並且棧爲空

//二叉樹的先序非遞歸遍歷

void  preorderRaversal2(BTNode *root)
{
	const stack<BTNode>::size_type stackSize=100;  //給定棧的大小
	stack<BTNode> BTNodeStack;   //定義一個空棧
	BTNode *p=root;
	while(p||!BTNodeStack.empty())
	{
		while(p)
		{
			cout<<p->data<<" ";
 			BTNodeStack.push(*p);
			p=p->lchild;
		}
		if(!BTNodeStack.empty())
		{
			p=&BTNodeStack.top();
			BTNodeStack.pop();
			p=p->rchild;
		}
	}
}


5、二叉樹的中序非遞歸遍歷

//中序非遞歸遍歷
void inorderRaversal2(BTNode *root)
{
	const stack<BTNode>::size_type stackSize=100;  //給定棧的大小
	stack<BTNode> BTNodeStack;   //定義一個空棧
	BTNode *p=root;
	while(p||!BTNodeStack.empty())
	{
		while(p)
		{
			BTNodeStack.push(*p);
			p=p->lchild;
		}
		if(!BTNodeStack.empty())
		{
			p=&BTNodeStack.top();
			BTNodeStack.pop();
			cout<<p->data<<" ";
			p=p->rchild;
		}
	}
}

6、二叉樹的後序非遞歸遍歷

typedef enum{L,R} tagtype;
typedef struct  
{
	BTNode *p;
	tagtype tag;
}stacknode;

void postorderRaversal2(BTNode *root)
{
	const stack<stacknode>::size_type stackSize=100;  //給定棧的大小
	stack<stacknode> BTNodeStack;   //定義一個空棧
	BTNode *p=root;
	stacknode x;
	do 
	{
		while (p)
		{
			x.p=p;
			x.tag=L;
			BTNodeStack.push(x);
			p=p->lchild;
		}
		while(!BTNodeStack.empty()&&BTNodeStack.top().tag==R)
		{
			x=BTNodeStack.top();
			BTNodeStack.pop();
			p=x.p;
			cout<<p->data<<" ";
		}
		if(!BTNodeStack.empty())
		{
			BTNodeStack.top().tag=R;
			p=BTNodeStack.top().p->rchild;
		}
	}while(!BTNodeStack.empty());
}


發佈了40 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章