树的实现与基本算法

#include<iostream>
#include<stdio.h>
#include<string>
#include<queue>
#define MAX 1000
using namespace std;
typedef  char Elemtype;
typedef struct node {
	Elemtype data;
	int index;
	int layer;//层次
	struct node *lchild, *rchild;
} BiTnode, *BiTtree;
typedef struct Tree {
	Elemtype Data;
	char Lchild;
	char Rchild;
} TreeNode;
void creatBTree(BiTtree &bt) {
	Elemtype ch;
	cin >> ch;
	if (ch == '#')
		bt = NULL; //递归结束的标志??
	else {
		bt = (BiTnode *)malloc(sizeof(BiTnode));
		bt->data = ch;
		creatBTree(bt->lchild);
		creatBTree(bt->rchild);
	}
//		先左后右
}
static int j = 1;
void Create_QuietTree(BiTtree T, TreeNode a[]) {
	if (T->lchild != NULL)
		Create_QuietTree(T->lchild, &a[0]);

	a[j].Data = T->data;
	if (T->rchild == NULL)
		a[j].Rchild ='*';
	else
		a[j].Rchild = T->rchild->index+48 ;//数字转字符(char)T->rchild->index强制类型转换
		// itoa(T->rchild->index,a[j].Rchild,10);
	if (T->lchild == NULL)
		a[j].Lchild = '*';
	else
		a[j].Lchild = T->lchild->index+48;
		// itoa(T->lchild->index,a[j].Lchild,10);
	j++;

	if (T->rchild != NULL)
		Create_QuietTree(T->rchild, &a[0]);
}//中序储存到静态数组中
static int i = 1;
void INorderTrverse(BiTtree &bt) { //中序遍历
	if (bt) {
		//TODO
		INorderTrverse(bt->lchild);
		cout << bt->data << " ";
		bt->index = i;
		i++;
		INorderTrverse(bt->rchild);
	}
}
void PreOrderTraverse(BiTtree bt) { //先序遍历
	if (bt) {
		cout << bt->data << " ";
		PreOrderTraverse(bt->lchild);
		PreOrderTraverse(bt->rchild);
	}
}
void PreOrderTraverse2(BiTtree bt) { //非递归
	BiTtree Stack[MAX], p;
	int top;
	if (bt == NULL) return;
	top = 0;
	Stack[top++] = bt;

	while (top > 0) {
		p = Stack[--top];
		printf("%c ", p->data);
		if (p->rchild) {
			Stack[top++] = p->rchild;
		}
		if (p->lchild) {
			Stack[top++] = p->lchild;
		}
	}
}
int GetBiTNodeCount(BiTtree bt){//统计二叉树节点数
	if(bt==NULL) return 0;
	int LeftCount=GetBiTNodeCount(bt->lchild);
	int RightCount=GetBiTNodeCount(bt->rchild);
	return RightCount+LeftCount+1;
}

void PoseOrderTraverse(BiTtree bt) { //后序
	if (bt) {
		PoseOrderTraverse(bt->lchild);
		PoseOrderTraverse(bt->rchild);
		cout << bt->data << " ";
	}
}
/*利用队列进行层次遍历,用一个while循环,循环结束条件为队列不为空时 */
void LayerOrder(node *root) {
	queue<node *>q;
	root->layer = 1;
	q.push(root);
	while (!q.empty()) {
		node *now = q.front();
		q.pop();
		printf("%c ", now->data);
		if (now->lchild != NULL) {
			now->lchild->layer = now->layer + 1;
			q.push(now->lchild);
		}
		if (now->rchild != NULL) {
			now->rchild->layer = now->layer + 1;
			q.push(now->rchild);
		}
	}
}
void InOrderTraverse(BiTtree T ) {//非递归中序遍历,栈的思想
	BiTtree Stack[MAX], p;
	int top = 0;
	p = T;
	while (p != NULL) {
		Stack[top] = p;
		top++;//4
		p = p->lchild;
	}
	while (top > 0) {
		top--;
		p = Stack[top];
		printf("%c ", p->data);
		p = p->rchild;
		while (p != NULL) {
			Stack[top] = p;
			top++;
			p = p->lchild;

		}

	}
}
int LeafNodeCount(BiTtree T){//统计叶子结点个数
	if(T==NULL) return 0;
	else if(T->lchild==NULL&&T->rchild==NULL) return 1;//递归结束条件
	else 
	return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);
}
int CountNode1(BiTtree bt){//度为1的结点个数
	int n1,n2;
	if(bt==NULL||(bt->lchild==NULL)&&(bt->rchild==NULL)) return 0;
	n1=CountNode1(bt->lchild);
	n2=CountNode1(bt->rchild);
	if(bt->lchild!=NULL&&bt->rchild!=NULL) return n1+n2;
	return n1+n2+1;
}
int CountNode2(BiTtree bt){//统计度为2的结点个数
		int n1,n2;
		if(bt==NULL||(bt->lchild==NULL)&&(bt->rchild==NULL)) return 0;
		n1=CountNode2(bt->lchild);
		n2=CountNode2(bt->rchild);
		if(bt->lchild!=NULL&&bt->rchild!=NULL) return n1+n2+1;
		return n1+n2;
}
int BitreeHeight(BiTtree T){
	if(T==NULL) return 0;
	else{
		int h1,h2;
		h1=BitreeHeight(T->lchild);
		h2=BitreeHeight(T->rchild);
		return (h1>h2?h1:h2)+1;
	}
}
int NodeLevel(BiTtree T,Elemtype x){
	if(T==NULL) return 0;
	if(T->data==x) return 1;
	int c1=NodeLevel(T->lchild,x);
	if(c1>1) return c1+1;
	int c2=NodeLevel(T->rchild,x);
	if(c2>1) return c2+1;
	r eturn 0;
}
// int JudgeComplete(BiTtree bt){
// 	int tag=1;//tag表示有
// }
int main() {
	BiTtree bt;
	TreeNode a[100];
	cout << "plase input a binaryTree:(先序创建)" << endl;
	creatBTree(bt);
	cout << "先序:" << endl;
	PreOrderTraverse2(bt);
	cout << endl;
	cout << "后序:" << endl;
	PoseOrderTraverse(bt);
	cout << endl;
	cout << "中序遍历:" << endl;
	INorderTrverse(bt);
	// InOrderTraverse(bt);
	cout << endl;
	cout << "层序遍历" << endl;
	LayerOrder(bt);
	Create_QuietTree(bt, &a[0]);
	cout << endl;
	int K;
	printf("中序遍历编号\t头节点\t\t左孩子\t\t右孩子\\ps:愿天堂再无bug,折寿啊\n");
	for (K = 1; K < j; K++) { //i?
		printf("%d\t\t%c\t\t%c\t\t%c\n", K, a[K].Data, a[K].Lchild, a[K].Rchild);
		// cout<<K<<a[K].Data<<a[K].Lchild<<a[K].Rchild<<endl;
	}
	printf("结点个数:%d\n",GetBiTNodeCount(bt));
	cout<<"叶子结点个数:"<<LeafNodeCount(bt)<<endl;
	cout<<"度为1的结点个数"<<CountNode1(bt)<<endl;
	cout<<"度为2的节点个数"<<CountNode2(bt)<<endl;
	cout<<"树的高度"<<BitreeHeight(bt)<<endl;
	cout<<"结点A在第"<<NodeLevel(bt,'A')<<"层"<<endl;
	return 0;
}
//ABC##F##D#E##

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值