二叉树——创建和遍历(递归、非递归)

表示形式:链式结构

递归算法:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

using namespace std;

typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

int Nodenum = 0;
int Count = 0;

Status CreateBiTree(BiTree &T)
{
	char ch;
	cin >> ch;
	if (ch == '#')
		T = NULL;
	else
	{
		if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
	return OK;

}

Status PreOrderTraverse(BiTree T)
{
	if (T)
	{
		printf("%c", T->data);
		if (PreOrderTraverse(T->lchild))
			if (PreOrderTraverse(T->rchild))
				return OK;
		return ERROR;
	}
	else
		return OK;
}

Status InOrderTraverse(BiTree T)
{
	int m = 0;
	if (T)
	{
		if (InOrderTraverse(T->lchild))
			m = 1;
		cout << T->data;
		if (m)
			if (InOrderTraverse(T->rchild))
				return OK;
		return ERROR;
	}
	else
		return OK;
}

Status PostOrderTraverse(BiTree T)
{
	if (T)
	{
		if (PostOrderTraverse(T->lchild))
			if (PostOrderTraverse(T->rchild))
			{
				cout << T->data;
				return OK;
			}
		return ERROR;

	}
	else
		return OK;
}

Status NodeCount(BiTree T)
{
	if (T)
	{
		Nodenum++;
		if (NodeCount(T->lchild))
			if (NodeCount(T->rchild))
				return OK;
		return ERROR;

	}
	else
		return OK;
}

Status LeafCount(BiTree T)
{
	if (T)
	{
		if (T->lchild == NULL&&T->rchild == NULL)
		{
			cout << T->data;
			Count++;
		}
		if (LeafCount(T->lchild))
			if (LeafCount(T->rchild))
				return OK;
		return ERROR;
	}
	else
		return OK;
}

/*
交换二叉树中所有节点的左右子树
*/
Status ExchangeBiTree(BiTree &T)
{
	BiTree p;
	if (T)
	{
		if (T->lchild || T->rchild) {
			p = T->lchild;
			T->lchild = T->rchild;
			T->rchild = p;
		}
		if (ExchangeBiTree(T->lchild))
			if (ExchangeBiTree(T->rchild))
				return OK;
		return ERROR;
	}
	else
		return OK;
}

Status CopyBiTree(BiTree T, BiTree &B)
{
	if (T == NULL)
		B = NULL;
	else
	{
		if (!(B = (BiTNode *)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		B->data = T->data;
		CopyBiTree(T->lchild, B->lchild);
		CopyBiTree(T->rchild, B->rchild);
	}
	return OK;
}

Status DestroyTree(BiTree &T)
{
	if (T)
	{
		DestroyTree(T->lchild);
		DestroyTree(T->rchild);
		free(T);
	}
	return OK;
}

Status ClearTree(BiTree &T)
{
	if (T)
	{
		T = NULL;
	}
	return OK;
}

int Depth(BiTree T)
{
	int leftDepth, rightDepth;
	if (T == NULL)
		return 0;
	else
	{
		leftDepth = Depth(T->lchild);
		rightDepth = Depth(T->rchild);
		if (leftDepth >= rightDepth)
			return leftDepth + 1;
		else
			return rightDepth + 1;
	}
}

void main()
{
	BiTree T, B;
	cout << "创建二叉树,按先序次序输入二叉树中结点的值:" << endl;
	CreateBiTree(T);
	NodeCount(T);
	cout << "二叉树的结点个数为" << Nodenum << endl;
	cout << "二叉树的深度为:" << Depth(T) << endl;
	cout << "先序遍历二叉树,结果是:" << endl;
	PreOrderTraverse(T);
	cout << endl;
	cout << "中序遍历二叉树,结果是:" << endl;
	InOrderTraverse(T);
	cout << endl;
	cout << "后序遍历二叉树,结果是:" << endl;
	PostOrderTraverse(T);
	cout << endl;
	cout << "输出二叉树的叶子结点:" << endl;
	LeafCount(T);
	cout << endl;
	cout << "统计二叉树的叶子结点个数:" << Count << endl;
	cout << "交换二叉树中所有节点的左右子树!" << endl;
	ExchangeBiTree(T);
	if (CopyBiTree(T, B) == OK)
		cout << "成功复制二叉树T到二叉树B" << endl;
	if (DestroyTree(T) == OK)
		cout << "成功销毁二叉树T!" << endl;
	if (ClearTree(T) == OK)
		cout << "成功将二叉树T置为空树!" << endl;
	cout << "先序遍历二叉树B,结果是:" << endl;
	PreOrderTraverse(B);
	cout << endl;
	cout << "中序遍历二叉树B,结果是:" << endl;
	InOrderTraverse(B);
	cout << endl;
	cout << "后序遍历二叉树B,结果是:" << endl;
	PostOrderTraverse(B);
	cout << endl;
	system("pause");
}

非递归算法:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define maxSize 50
using namespace std;

typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

int Nodenum = 0;
int Count = 0;//二叉树叶子结点统计

BiTree CreateBiTree()
{
	TElemType ch[maxSize];
	cin >> ch;
	int len = (int)strlen(ch);
	BiTree stack[maxSize];
	int top = -1;
	int i = 0;
	if (ch[i] == 0)
		return NULL;
	BiTree temp;
	BiTree root = new BiTNode();
	root->data = ch[i];
	root->lchild = NULL;
	root->rchild = NULL;
	stack[++top] = root;//根节点入栈
	i++;
	int flag = 1;//标志位:第一种情况:创建左孩子;2:创建右孩子;3:左右孩子均创建,出栈
	while (i < len)
	{
		BiTree pNew = NULL;
		if (flag == 1)//创建左孩子
		{
			/*
			'#'说明这是栈顶结点无左孩子,把标志位置2,判断右孩子
			*/
			if (ch[i] == '#')
			{
				
				flag = 2;
			}
			else
			{
				pNew = new BiTNode();
				pNew->data = ch[i];
				pNew->lchild = NULL;
				pNew->rchild = NULL;

				temp = stack[top];//取出当前栈顶
				temp->lchild = pNew;//当前结点为栈顶结点的左孩子
				stack[++top] = pNew;//当前结点入栈
				flag = 1;//使标志位初始化
			}
		}
		else if (flag == 2)//创建右孩子
		{
			/*
			栈顶结点无右孩子
			*/
			if (ch[i] == '#')
			{
				
				flag = 3;
			}
			else
			{
				/*
				与创建左孩子同理
				*/
				pNew = new BiTNode();
				pNew->data = ch[i];
				pNew->lchild = NULL;
				pNew->rchild = NULL;

				temp = stack[top];
				temp->rchild = pNew;
				stack[++top] = pNew;
				flag = 1;//置1继续判断结点的左孩子(左孩子优先)
			}
		}
		else//左右孩子都创建
		{
			temp = stack[top--];
			while (top > 0 && stack[top]->rchild == temp)
				--top;

			flag = 2;
			--i;
		}
		++i;
	}
	return root;
}
/*
先序遍历非递归算法
*/
void PreOrderTraverse(BiTree T)
{
	if (T)
	{
		BiTNode *Stack[maxSize];
		int top = -1;
		BiTNode *p;
		Stack[++top] = T;
		while (top != -1)
		{
			p = Stack[top--];
			cout << p->data;
			if (p->rchild != NULL)
				Stack[++top] = p->rchild;
			if (p->lchild != NULL)
				Stack[++top] = p->lchild;
		}
	}
}
/*
中序遍历的非递归算法
*/
void InOrderTraverse(BiTree T)
{
	
	if (T)
	{
		BiTNode *Stack[maxSize];
		int top = -1;
		BiTNode *p = T;
		while (top != -1 || p != NULL)
		{
			while (p != NULL)
			{
				Stack[++top] = p;
				p = p->lchild;
			}
			if (top != -1)
			{
				p = Stack[top--];
				cout << p->data;
				p = p->rchild;
			}
		}
	}	
}

/*
后序遍历的非递归算法
*/

void PostOrderTraverse(BiTree T)
{
	if (T)
	{
		BiTNode *Stack1[maxSize];
		int top1 = -1;
		BiTNode *Stack2[maxSize];
		int top2 = -1;
		BiTNode *p = NULL;
		Stack1[++top1] = T;
		while (top1 != -1)
		{
			p = Stack1[top1--];
			Stack2[++top2] = p;
			if (p->lchild!=NULL)
				Stack1[++top1] = p->lchild;
			if (p->rchild != NULL)
				Stack1[++top1] = p->rchild;
		}
		while (top2 != -1)
		{
			p = Stack2[top2--];
			cout << p->data;
		}
	}
	
}
/*
层次遍历非递归算法
*/
void level(BiTree T)
{
	int front, rear;
	BiTNode *queue[maxSize];//队列先进先出
	front = rear = 0;
	BiTNode *q;
	if (T != NULL)
	{
		rear = (rear + 1) % maxSize;//循环队列,避免越界
		queue[rear] = T;//首节点结点插入队尾
		while (front != rear)//说明队列中尚有结点
		{
			front = (front + 1) % maxSize;//避免越界
			q = queue[front];//队头结点出队
			cout << q->data;
			/*
			判断左右孩子,左孩子先进队列
			*/
			if (q->lchild != NULL)
			{
				rear = (rear + 1) % maxSize;
				queue[rear] = q->lchild;
			}
			if (q->rchild != NULL)
			{
				rear = (rear + 1) % maxSize;
				queue[rear] = q->rchild;
			}
		}
	}

}

Status NodeCount(BiTree T)
{
	if (T)
	{
		Nodenum++;
		if (NodeCount(T->lchild))
			if (NodeCount(T->rchild))
				return OK;
		return ERROR;

	}
	else
		return OK;
}
/*
   原理和层次遍历相同,稍作修改加个判断条件:
       此结点左右孩子是否为空,是则输出,不是则判断下一个
*/
void LeafCount(BiTree T)
{
	int front, rear;
	BiTNode *queue[maxSize];//队列先进先出
	front = rear = 0;
	BiTNode *q;
	if (T != NULL)
	{
		rear = (rear + 1) % maxSize;//循环队列,避免越界
		queue[rear] = T;//首节点结点插入队尾
		while (front != rear)//说明队列中尚有结点
		{
			front = (front + 1) % maxSize;//避免越界
			q = queue[front];//队头结点出队
			/*
			判断左右孩子,左孩子先进队列
			*/
			if (q->lchild != NULL)
			{
				rear = (rear + 1) % maxSize;
				queue[rear] = q->lchild;
			}
			if (q->rchild != NULL)
			{
				rear = (rear + 1) % maxSize;
				queue[rear] = q->rchild;
			}
			if (q->lchild == NULL&&q->rchild == NULL)
			{
				cout << q->data;
				Count++;
			}
		}
	}
}

/*
交换二叉树中所有节点的左右子树:
(非递归)
     第一步:层次遍历:入队列
	 第二步:交换每个结点的左右子树
*/
void ExchangeBiTree(BiTree &T)
{
	if (T)
	{
		BiTNode *temp;
		BiTNode *p;
		int front, rear;
		front = rear = 0;
		BiTNode *queue[maxSize];
		if (T != NULL)
		{
			rear = (rear + 1) % maxSize;//循环队列,避免越界
			queue[rear] = T;//首节点结点插入队尾
			while (front != rear)//说明队列中尚有结点
			{
				front = (front + 1) % maxSize;//避免越界
				p = queue[front];//队头结点出队
				/*
				判断左右孩子,左右孩子进队列
				*/
				if (p->lchild != NULL)
				{
					rear = (rear + 1) % maxSize;
					queue[rear] = p->lchild;
				}
				if (p->rchild != NULL)
				{
					rear = (rear + 1) % maxSize;
					queue[rear] = p->rchild;
				}

				temp = p->lchild;
				p->lchild = p->rchild;
				p->rchild = temp;
			}
		}
	}
}

Status CopyBiTree(BiTree T, BiTree &B)
{
	if (T == NULL)
		B = NULL;
	else
	{
		if (!(B = (BiTNode *)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		B->data = T->data;
		CopyBiTree(T->lchild, B->lchild);
		CopyBiTree(T->rchild, B->rchild);
	}
	return OK;
}
/*
    销毁二叉树
*/
Status DestroyTree(BiTree &T)
{
	if (T)
	{
		DestroyTree(T->lchild);
		DestroyTree(T->rchild);
		free(T);
	}
	return OK;
}
/*
   清空二叉树
*/
Status ClearTree(BiTree &T)
{
	if (T)
	{
		T = NULL;
	}
	return OK;
}
/*
   求二叉树的深度(非递归算法):(层次遍历)
*/
int Depth(BiTree T)
{
	int level = 0;//层次
	if (T)
	{
		int front = 0, rear = 0;
	BiTNode *Queue[maxSize]; 
	Queue[rear++] = T;
	
			
	while (front!=rear)
	{
		int len = rear - front;
		level++;
		while (len--)
		{
			BiTNode *temp = Queue[front];
			front++;
			if (temp->lchild)
				Queue[rear++] = temp->lchild;
			if (temp->rchild)
				Queue[rear++] = temp->rchild;
		}
	}					
	}


	return level;
}

void main()
{
	BiTree T, B;
	cout << "创建二叉树,按先序次序输入二叉树中结点的值:" << endl;
	T=CreateBiTree();
	NodeCount(T);
	cout << "二叉树的结点个数为" << Nodenum << endl;
	cout << "二叉树的深度为:" << Depth(T) << endl;
	cout << "先序遍历二叉树,结果是:" << endl;
	PreOrderTraverse(T);
	cout << endl;
	cout << "中序遍历二叉树,结果是:" << endl;
	InOrderTraverse(T);
	cout << endl;
	cout << "后序遍历二叉树,结果是:" << endl;
	PostOrderTraverse(T);
	cout << endl;
	cout << "层次遍历二叉树,结果是:" << endl;
	level(T);
	cout << endl;
	cout << "输出二叉树的叶子结点:" << endl;
	LeafCount(T);
	cout << endl;
	cout << "统计二叉树的叶子结点个数:" << Count << endl;
	cout << "交换二叉树中所有节点的左右子树!" << endl;
	ExchangeBiTree(T);
	if (CopyBiTree(T, B) == OK)
		cout << "成功复制二叉树T到二叉树B" << endl;
	if (DestroyTree(T) == OK)
		cout << "成功销毁二叉树T!" << endl;
	if (ClearTree(T) == OK)
		cout << "成功将二叉树T置为空树!" << endl;
	cout << "先序遍历二叉树B,结果是:" << endl;
	PreOrderTraverse(B);
	cout << endl;
	cout << "中序遍历二叉树B,结果是:" << endl;
	InOrderTraverse(B);
	cout << endl;
	cout << "后序遍历二叉树B,结果是:" << endl;
	PostOrderTraverse(B);
	cout << endl;
	system("pause");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值