程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二叉樹的鏈表實現

二叉樹的鏈表實現

編輯:C++入門知識

直接上代碼:

/*
	二叉樹的鏈表實現:
	以及三種遍歷方式:
	author:天下無雙
	Date:2014-5-28
	Version:2.0
*/
#include 
#include 
typedef int T;//樹內節點的數據類型
using namespace std;
class BiTree
{
private:
	struct BiNode{
		T data;
		BiNode *lchild,*rchild;
		BiNode(T d){
			data=d;
			lchild=nullptr;
			rchild=nullptr;
		}
	};
	BiNode *root;
public:
	BiTree(){
		//root=root->rchild=root->rchild=nullptr;
		root=nullptr;
	}
	~BiTree(){
		
	}
	//使用遞歸創建二叉樹
	//以二叉排序樹的規則建立
	/*二級指針寫法
	bool addBiNode(BiNode **nodeRoot,T d){
		if(*nodeRoot==nullptr){
			BiNode *p=new BiNode(d);
			*nodeRoot=p;
			cout<data<<"  insert success!"<data){
			//往左子樹遞歸
			addBiNode(&((*nodeRoot)->lchild),d);
		}else if(*nodeRoot!=nullptr&&d>(*nodeRoot)->data){
			//往右子樹遞歸
			addBiNode(&((*nodeRoot)->rchild),d);
		}else{
			cout<<"樹中已有該數據"<data<<"  insert success!"<data){
			//往左子樹遞歸
			addBiNode(nodeRoot->lchild,d);
		}else if(nodeRoot!=nullptr&&d>(nodeRoot)->data){
			//往右子樹遞歸
			addBiNode(nodeRoot->rchild,d);
		}else{
			cout<<"樹中已有該數據"<data<<" ";
	}
	//利用遞歸遍歷,三種遍歷原理都是一樣的
	//前序遍歷,先根遍歷
	void PreOrderTraverse(const BiNode *nodeRoot)const{
		if(nodeRoot!=nullptr)
			Visit(nodeRoot);
		if(nodeRoot->lchild!=nullptr)
			PreOrderTraverse(nodeRoot->lchild);
		if(nodeRoot->rchild!=nullptr)
			PreOrderTraverse(nodeRoot->rchild);
	}
	//中根遍歷
	void InOrderTraverse(const BiNode *nodeRoot)const{
		if(nodeRoot->lchild!=nullptr)
			InOrderTraverse(nodeRoot->lchild);
		if(nodeRoot!=nullptr)//當該點左子樹空時
			Visit(nodeRoot);
		if(nodeRoot->rchild!=nullptr)
			InOrderTraverse(nodeRoot->rchild);
	}
	//後序遍歷
	void PostOrderTraverse(const BiNode *nodeRoot)const{
		if(nodeRoot->lchild!=nullptr)
			PostOrderTraverse(nodeRoot->lchild);
		if(nodeRoot->rchild!=nullptr)
			PostOrderTraverse(nodeRoot->rchild);
		if(nodeRoot!=nullptr)
			Visit(nodeRoot);
	}
};

測試代碼:

int main()
{
	
	BiTree b;
	//b.addBiNode(&b.root,50);//設立根節點值//二級指針寫法
	b.addBiNode(b.getRoot(),50);//指針的引用寫法
	int i;
	int arr[9]={30,40,35,27,100,90,110,95,-999};
	bool flag=true;
	while(flag)
	{
		flag=!flag;
		//cout<<"請輸入一個數(輸入-999將退出:";
		//cin>>i;
		for(int j=0;j<9;j++)
		{
		i=arr[j];
		if(i==-999)
			break;
		
		b.addBiNode(b.getRoot(),i);
		}
		//b.addBiNode(&b.root,i);
	}
	b.Traverse(b.getPtrToRoot(),"PreOrderTraverse");
	b.Traverse(b.getPtrToRoot(),"InOrderTraverse");
	b.Traverse(b.getPtrToRoot(),"PostOrderTraverse");
	cin.get();
	system("pause");
	return 0;
}

測試結果:(注意,輸入順序不同時生成的樹不同)


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved