二叉树基本算法

二叉树的存储结构(C++

遍历:先序遍历,中序遍历,后序遍历

附上代码://二叉树的存储和遍历,创建二叉树,后序的直接加上函数和算法

#include<iostream>

usingnamespace std;

typedefstruct Node{

        char data;

        struct Node *lchild,*rchild;

}*Bitree;

//创建二叉树

voidCreatBtree(Bitree &T)

{

        //先序次序输入二叉树节点的值

        char ch;

        cin>>ch;

        if(ch=='#')

        {

                 T = NULL ;//树的值为空,用于返回上一层,递归结束点。

         }

         else{

               T=new Node;

               T->data = ch ;

               //递归

                   CreatBtree(T->lchild);

                   CreatBtree(T->rchild);

         }

       

 }

 //遍历二叉树

voidTravel(Bitree T)

{

        if(T)

        {

                 cout<<T->data;

                 Travel(T->lchild);

                 Travel(T->rchild);

        }

 }

int main(void)

{

        Bitree T;

        CreatBtree(T);

        /*字符的输入 ABC##DE#G##F###*/

        Travel(T);

        return 0;

 }

#代表值为NULL,返回上一层,撸多了没用,看图说话


 

算法:复制二叉树,计算二叉树的深度,统计二叉树节点的个数

//复制二叉树;

 void CopyTree(Bitree T , Bitree &T1)

 {

       if(T== NULL)

       {

                T1= NULL;

                return;

         }

         else{

               T1 =new Node;

               T1->data = T->data;

               //递归

               CopyTree(T->lchild,T1->lchild);

               CopyTree(T->rchild,T1->rchild);

         }

 }

 

//深度计算层数//5

intDepth(Bitree T){

       intm,n;

       if(T==NULL)

       {

                return0;

         }

       else{

                m=  Depth(T->lchild)+1;

                n=  Depth(T->rchild)+1;

                if(m>=n)

                {

                  return m;

         }

         else{

               return n;

         }

 }

}

//统计二叉树节点的个数

intCountTree(Bitree T){

        if(T == NULL)

        {

                return0;

        }

        else{

                 return CountTree(T->lchild)+CountTree(T->rchild)+1;

        }

}

 

//对于递归的理解,二叉树本身递归情况的分类就是空树和一个单独的节点,每一个节点,递归就是子树,我们只需要找到空树与一个节点的关系就可以很正确的理解递归。

       

#include<iostream>
using namespace std;
typedef struct Node{
	char data;
	struct Node *lchild,*rchild;
}*Bitree;
//创建二叉树 
void CreatBtree(Bitree &T)
{
	//先序次序输入二叉树节点的值
	char ch;
	cin>>ch;
	if(ch=='#')
	{
		T = NULL ;//树的值为空,用于返回上一层,递归结束点。 
	 } 
	 else{
	 	T=new Node;
	 	T->data = ch ;
	 	//递归
		  CreatBtree(T->lchild);
		  CreatBtree(T->rchild);
	 } 
	
 } 
 //遍历二叉树
void Travel(Bitree T)
{
	if(T)
	{
		cout<<T->data;
		Travel(T->lchild);
		Travel(T->rchild);
	}
 } 
 //复制二叉树;
 void CopyTree(Bitree T , Bitree &T1)
 {
 	if(T == NULL)
 	{
 		T1 = NULL;
 		return ;
	 }
	 else{
	 	T1 =new Node;
	 	T1->data = T->data;
	 	//递归 
	 	CopyTree(T->lchild,T1->lchild);
	 	CopyTree(T->rchild,T1->rchild);
	 }
 }
 //二叉树的深度;
 int Depth(Bitree T){
 	int m,n;
 	if(T==NULL)
 	{
 		return 0;
	 }
 	else{
 		m =  Depth(T->lchild)+1;
 		n =  Depth(T->rchild)+1;
 		if(m>=n)
 		{
		 return m; 
	 }
	 else{
	 	return n;
	 }
 }
}
//统计二叉树的节点个数 
int CountTree(Bitree T){
	if(T == NULL)
	{
		return 0;
	}
	else{
		return  CountTree(T->lchild)+CountTree(T->rchild)+1;
	}
} 
int main(void)
{
	Bitree T,T1;
	CreatBtree(T);
	/*字符的输入 ABC##DE#G##F###*/
	Travel(T);
	cout<<endl;
	
	CopyTree(T ,T1);
	Travel(T1);
	cout<<endl;
	cout<<Depth(T);//5
	cout<<endl;
	cout<<CountTree(T);
	return 0;
 } 


原文地址:https://www.cnblogs.com/love-life-insist/p/9062937.html