二叉树插件操作,改天来注释,要多用引用和++i,不然stl用起来很慢,总是被构造和析构,切记

# include <malloc.h>
# include <iostream>
# include <conio.h>
# include <stdlib.h>
#include <string>
#include <queue>
#include <assert.h>
using namespace std;
# define OK 1
# define ERROR 0	
# define OVERFLOW 0
typedef char TElemType;
static string prostr,instr,postdtr;
static int m;
typedef struct BiTNode			//定义二叉树结构
{  
	TElemType		data;
struct BiTNode	*lchild,*rchild;
}BiTNode, *BiTree;

int PostOrderTraverse(BiTree T)		//PreOrderTravers sub-function
{  
	if(T)
	{  
		if (PostOrderTraverse(T->lchild))
		{
			if (PostOrderTraverse(T->rchild))
			{cout<<T->data<<"->";					//visite T
			postdtr +=T->data;
			return OK;}
		}
		return (ERROR);
	} //if end
	else
		return (OK);
} //PreOrderTraverse() end
void TInOrder(BiTree T)		//中序 sub-function
{  
	BiTNode *tstack[100];
	BiTNode *p = T;
	int top =0;
	do 
	{
		while (p)
		{
			top++;
			tstack[top] = p;
			p = p->lchild;
		}
		if (top>0)
		{
			p = tstack[top];
			cout<<p->data;
			top--;
// 			if (p->rchild)
// 			{
// 				top++;
// 				tstack[top] = p->rchild;
// 			}
			p =p->rchild;//一直取到p的度为2的节点
		}
	} while (p!=NULL||top!=0);
	
} //PreOrderTraverse() end
void TPostOrder(BiTree T)		//后序 sub-function
{  
	BiTNode *tstack[100];
	BiTNode *p = T;
	int top =0;
	int tag[100];
	do 
	{
		while (p)
		{		
			tag[top] =0;
			tstack[top] = p;
			p = p->lchild;
			top++;
		}
		if (top>0){
			while (tag[top-1]==1)//如果堆栈顶的tag为1,那么
			{
				top--;
				p = tstack[top];
				cout<<p->data;
			}
			if(top>0)
			{
				tag[top-1] = 1;//将它置为1的目的是看看tstack[top-1]这个节点有
				//没有右节点,如果有的话,就保存到tstack[top-1]之前
				p = tstack[top-1];
				p = p->rchild;
			}
		}
	} while (top>0);

}
void TPreOrder(BiTree T)		//PreOrderTravers sub-function
{  
	BiTNode *tstack[100];
	BiTNode *p = T;
	int top =0;
	while (p->lchild&&p->rchild)
	{
		top =1;
		tstack[top] = T;
		while (top>0)
		{
			p= tstack[top];
			cout<<p->data;
			top--;
			if (p->rchild)
			{
				tstack[++top] = p->rchild;
			}
			if (p->lchild)
			{
				top++;
				tstack[top] = p->lchild;
			}
		}
	}
} //PreOrderTraverse() end

// string TProcess(string prostr, string instr)		//PreOrderTravers sub-function
// {  
// 	string ch="";
// 	ch+=postdtr[0];
// 	string npre1="",npre2="",nmid1="",nmid2="";
// 	int i,j;
// 	int len1 = postdtr.length();
// 	int len2 = instr.length();
// 	if (len1==1||len1==0)
// 	{
// 		return postdtr;
// 	}
// 	i=instr.find(ch);                    //查找pre[0]在mid中的位置 
// 	nmid1=instr.substr(0,i);              //求nmid1 
// 	nmid2=instr.substr(i+1);               //求nmid2 
// 	npre1=prostr.substr(1,i);              //求npre1 
// 	npre2=prostr.substr(i+1);              //求npre2 
// 	return TProcess(npre1,nmid1)+TProcess(npre2,nmid2)+ch;   //rear=nrear1+nrear2+pre[0
// } 


void exchange(BiTree T)
{
	if (T == NULL)
	{
		return ;
	}
	//assert(T);
	if (NULL ==T->lchild && NULL == T->rchild)
	{
		return ;
	}
	BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
//	p->data = T->lchild->data;
	p->lchild = T->lchild;
	T->lchild = T->rchild;
	T->rchild = p->lchild;
	//free p;
	//p = NULL;
	exchange(T->lchild);
	exchange(T->rchild);
}

//判断一个节点t是否在以r为根的子树中
bool is_in_tree(BiTNode *r, BiTNode *t)
{
	if(r == NULL)
	{
		return false;
	}
	else if(r->data == t->data)
	{
		return true;
	}
	else
	{
		bool has = false;
		if(r->lchild != NULL)
		{
			has = is_in_tree(r->lchild,t);
		}
		if(!has && r->rchild!= NULL)
		{
			has = is_in_tree(r->rchild,t);
		}
		return has;
	}
 }


BiTNode * get_nearest_common_father(BiTNode *r,BiTNode *pNode1,BiTNode *pNode2)
{
	//pNode2在以pNode1为根的子树中(每次递归都要判断,放在这里不是很好。)
	if(is_in_tree(pNode1,pNode2))
	{
		return pNode1;
	}
	//pNode1在以pNode2为根的子树中
	if(is_in_tree(pNode2,pNode1))
	{
		return pNode2;
	}
	bool one_in_left,one_in_right,another_in_left,another_in_right;
	one_in_left = is_in_tree(r->lchild,pNode1);
	another_in_right = is_in_tree(r->rchild,pNode2);
	another_in_left = is_in_tree(r->lchild,pNode2);
	one_in_right = is_in_tree(r->rchild,pNode1);
	if((one_in_left && another_in_right) || (one_in_right && another_in_left))
	{
		return r;
	}
	else if(one_in_left && another_in_left)
	{
		return get_nearest_common_father(r->lchild,pNode1,pNode2);
	}
	else if(one_in_right && another_in_right)
	{
		return get_nearest_common_father(r->rchild,pNode1,pNode2);
	}
	else
	{
		return NULL;
	}
 }


//层次遍历
int BFS (BiTree T)
{
	if (T == NULL)
	{
		return 0;
	}
	deque<BiTNode *> q;//使用队列
	q.push_back(T);
	while (!q.empty())
	{
		BiTNode * p = q.front();
		cout<<p->data<<" -- ";
		q.pop_front();
		if (p->lchild != NULL)
		{
			q.push_back(p->lchild);
		}
		if (p->rchild != NULL)
		{
			q.push_back(p->rchild);
		}
	}
	cout<<endl;
	return 1;
	
}

void main()			//main() 函数
{  
	BiTree T;

	int Depth_BT (BiTree T);		//声明函数
	int CreateBiTree(BiTree &T);	
	int PreOrderTraverse(BiTree T);
	int InOrderTraverse(BiTree T);
	cout<<"下面以'根左右'的顺序构造二叉树: \n\n";
	cout<<"请输入二叉树元素,(/表示空),如 ABDG///EH//IK///C/F/J//"<<endl;
	if(CreateBiTree(T))			//调用 CreateBiTree()
	{
		cout<<"\n\n构造二叉树成功 ! 先序('根左右')遍历新建的二叉树如下:\n ";
		PreOrderTraverse(T);
		cout<<"NULL";
	}
	else
	cout<<endl<<"构造二叉树失败 ! ";
	cout<<endl;
	//exchange(T);
	BiTNode * node1 = (BiTNode *)malloc(sizeof(BiTNode));
 	node1->data = 'H';
	BiTNode * node2 = (BiTNode *)malloc(sizeof(BiTNode));
	BiTNode * node3 = (BiTNode *)malloc(sizeof(BiTNode));
 	node1 = T->lchild->lchild->lchild;
	node2 = T->lchild->rchild->rchild;
// 	bool findt = is_in_tree(T, node1);
	node3 = get_nearest_common_father(T,node1, node2);
	if (node3 != NULL)
	{
		cout<<node3->data<<endl;
	}
	InOrderTraverse(T);
	cout<<endl;
	//if (findt)
	{
		cout<<"HHHHHHHHHHHHHH"<<endl;
	}
	
	PostOrderTraverse(T);

	cout<<"\n\n二叉树的深度是 "<<Depth_BT(T)<<" !";	//调用Depth_BT()
	cout<<"\n\n...OK!..."<<endl;
	cout<<"haha"<<endl;
	TPreOrder(T);
	cout<<endl<<"heihei"<<endl;
	TInOrder(T);
		cout<<endl<<"yaya"<<endl;
	TPostOrder(T);
	// 	cout<<instr<<endl;
	// 	KPreOrderTraverse(T, 4);
	// 	
} //main() end

void KPreOrderTraverse(BiTree T, int k)		//PreOrderTravers sub-function
{  
	if(T&&k!=0)
	{  
		cout<<T->data<<"->";					//visite T
		//prostr+=T->data;
		m = k-1;//开全局变量,来存储现在已经找到几个节点
		KPreOrderTraverse(T->lchild,m);
		KPreOrderTraverse(T->rchild,m);

	} //if end

} //PreOrderTraverse() end
int CreateBiTree(BiTree &T)			//createBiTree() 子函数
{  
	TElemType ch;	
	cin>>ch;
	if(ch=='/')  
		T=NULL;
	else
	{  
		if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		T->data=ch;
		CreateBiTree(T->lchild);	//create lchild
		CreateBiTree(T->rchild);	//create rchild
	}
	return (OK);
} //CreateBiTree() end

int PreOrderTraverse(BiTree T)		//PreOrderTravers sub-function
{  
	if(T)
	{  
		cout<<T->data<<"->";					//visite T
		prostr+=T->data;
		if (PreOrderTraverse(T->lchild))		//traverse lchild
			if (PreOrderTraverse(T->rchild))	//traverse rchild
				return (OK);
		return (ERROR);
	} //if end
	else
		return (OK);
} //PreOrderTraverse() end


int InOrderTraverse(BiTree T)		//PreOrderTravers sub-function
{  
	if(T)
	{  
		if (InOrderTraverse(T->lchild))
		{
			cout<<T->data<<"->";					//visite T
			instr +=T->data;
			if (InOrderTraverse(T->rchild))
			return OK;
		}
		return (ERROR);
	} //if end
	else
		return (OK);
} //PreOrderTraverse() end
int Depth_BT ( BiTree T )		// T 采用二叉链表存储结构,求二叉树 T 的深度
{
	int d,depth_r,depth_l;
	if ( !T )		// 如果是空树,则其深度为 0
		return ( 0 );
	else  
	{
		depth_l = Depth_BT ( T->lchild );	// 递归调用 Depth_BT 算法,求二叉树 T 的左子树的深度
		depth_r = Depth_BT ( T->rchild );	// 递归调用 Depth_BT 算法,求二叉树 T 的右子树的深度
		if ( depth_l >= depth_r )	// 如果左子树的深度大于等于右子树的深度,则取左子树的深度为树 T 的深度
			d = depth_l;
		else						// 否则取右子树的深度为树 T 的深度
			d = depth_r;
		return ( 1+d );				//返回值
	} // else 结束
} // Depth_BT


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值