二叉树建立及其基本操作

二叉树的建立

方法一:按完全二叉树的层次顺序,依次输入结点信息建立二叉链表。
基本思想:一般的二叉树添加虚结点成为完全二叉树;依次输入结点信息,每进入一个字符建立一个节点,

无论是否为虚拟节点,虚拟节点下可以继续接入虚拟节点。

若是第一个结点,则令其为根结点,否则将新结点插入到它的双亲结点上。

用队列来实现这种先入先操作的数据结构,这里我就数组实现队列了。
如此重复,直到输入结束符号“\0”时停止(假设结点数据域为字符型)。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

typedef struct bittree
{
	char data;
	struct bittree *lc, *rc;
}Bittree, *Bit;

Bit Createtree()//按层建树 #代表虚拟节点可以在相面继续加值 
{
	int front, rear;
	char ch;
	Bit Q[100], T;
	ch = getchar();
	T = NULL;
	front = 1;
	rear = 0;
	while(ch != '\n')
	{
		Bit s = NULL;
		s = (Bit)malloc(sizeof(Bittree));
		s->data = ch;
		s->lc = s->rc = NULL;
		rear++;
		Q[rear] = s;
		if(rear == 1)
		T = s;
		else if(Q[front] != NULL&&rear != 1)
		{
			if(rear%2 == 0)
			{
				Q[front]->lc = s;
			}
			else
			{
				Q[front]->rc = s;
				front ++;
			}
		}
		ch = getchar();
	}
	return T;//还是正常return吧,别直接传指针地址了,蒙圈了 
}

void Pre_outtree(Bit T)//DLR
{
	if(T&&T->data!='#')
	{
		printf("%c", T->data);
		Pre_outtree(T->lc);
		Pre_outtree(T->rc); 
	}
}

void In_outtree(Bit T)//LDR
{
	if(T&&T->data!='#')
	{
		In_outtree(T->lc);
		printf("%c", T->data);
		In_outtree(T->rc);
	}
}

void Post_outtree(Bit T)//LRD
{
	if(T&&T->data!='#')
	{
		Post_outtree(T->lc);
		Post_outtree(T->rc);
		printf("%c", T->data);
	}
}

int num = 0;
void Countleave(Bit T)//深搜寻找叶子 1
{
	if(T&&T->data!='#')
	{
		if(T->lc == NULL)
	    {
	    	if(T->rc == NULL)
	    	{
	    		num++;
	    		return;
			}
			else if(T->rc->data == '#')
			{
				num++;
				return;
			}
    	}
		else if(T->lc->data == '#')
	    {
	    	if(T->rc == NULL)
	    	{
	    		num++;
	    		return;
			}
			else if(T->rc->data == '#')
			{
				num++;
				return;
			}
    	}
    	Countleave(T->lc);
    	Countleave(T->rc);
	}
}


void Lowup_out(Bit T, int space)
{
	if(T&&T->data!='#')
	{
		for(int i = 0; i<space; i++)
		printf("    ");
		printf("%c\n", T->data);
		Lowup_out(T->lc, space+1);
		Lowup_out(T->rc, space+1);
	}
}

Bit Change(Bit T)
{
	if(T&&T->data!='#')
	{
		Change(T->lc);
		Change(T->rc);
		Bit s;//求交换树 
        s = T->lc;
        T->lc = T->rc;
        T->rc = s;
	}
	return T;
 } 

void Output(Bit T)
{
	Lowup_out(T, 0);
	printf("pre_sequence  : ");
	Pre_outtree(T);
	printf("\n");
	printf("in_sequence   : ");
	In_outtree(T);
	printf("\n");
	printf("post_sequence : ");
	Post_outtree(T);
	printf("\n");
}

int main()
{
	Bit T;
	T = Createtree();
    printf("BiTree\n");
	Output(T);//几种输出操作 
    printf("Number of leaf: ");
    Countleave(T);
    printf("%d\n", num);
    T = Change(T);//求交换树 
    printf("BiTree swapped\n"); 
    Output(T);
	return 0;
}

方法二:先序建立二叉树

这种方法是按照先序的方式输入,进而建立二叉树。

为递归的思想:存入一个根节点之后他的两个孩子可以继续构成子树的根节点,进而建立递归

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

typedef struct bittree
{
	char data;
	struct bittree *lc, *rc;
}Bittree, *Bit;

Bit Createtree()//先序建树 #代表空节点即结束 不存入 
{
	char ch;
	scanf("%c", &ch);
	Bit T;
	if(ch == '#')
	    T = NULL;
	else
	{
		T = (Bit)malloc(sizeof(Bittree)); 
		T->data = ch;
		T->lc = Createtree();
		T->rc = Createtree();
	}
	return T;
} 

void Pre_outtree(Bit T)//DLR
{
	if(T)
	{
		printf("%c", T->data);
		Pre_outtree(T->lc);
		Pre_outtree(T->rc); 
	}
}

void In_outtree(Bit T)//LDR
{
	if(T)
	{
		In_outtree(T->lc);
		printf("%c", T->data);
		In_outtree(T->rc);
	}
}

void Post_outtree(Bit T)//LRD
{
	if(T)
	{
		Post_outtree(T->lc);
		Post_outtree(T->rc);
		printf("%c", T->data);
	}
}

//int num = 0;
//void Countleave(Bit T)//深搜寻找叶子 1
//{
//	if(T)
//	{
//		if(T->lc == NULL&&T->rc == NULL)
//	    {
//		    num++;
//		    return;
//    	}
//    	Countleave(T->lc);
//    	Countleave(T->rc);
//	}
//}

int Countleave(Bit T)//递归寻找叶子数 2 
{
	if(!T)
	return 0;
	if(T->lc == NULL&&T->rc == NULL)
	return 1;
	else
	{
		return Countleave(T->lc) + Countleave(T->rc);
	}
}

void Lowup_out(Bit T, int space)
{
	if(T)
	{
		for(int i = 0; i<space; i++)
		printf("    ");
		printf("%c\n", T->data);
		Lowup_out(T->lc, space+1);
		Lowup_out(T->rc, space+1);
	}
}

Bit Change(Bit T)
{
	if(T)
	{
		Change(T->lc);
		Change(T->rc);
		Bit s;//求交换树 
        s = T->lc;
        T->lc = T->rc;
        T->rc = s;
	}
	return T;
 } 

void Output(Bit T)
{
	Lowup_out(T, 0);
	printf("pre_sequence  : ");
	Pre_outtree(T);
	printf("\n");
	printf("in_sequence   : ");
	In_outtree(T);
	printf("\n");
	printf("post_sequence : ");
	Post_outtree(T);
	printf("\n");
}

int main()
{
	Bit T;
	T = Createtree();
    printf("BiTree\n");
	Output(T);//几种输出操作 
    printf("Number of leaf: ");
//    Countleave(T);
//    printf("%d\n", num);
    printf("%d\n", Countleave(T)); 
    T = Change(T);//求交换树 
    printf("BiTree swapped\n"); 
    Output(T);
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值