二叉树链式存储及相关操作

      先序创建二叉树、后序递归遍历二叉树、中序非递归遍历二叉树、层次遍历二叉树、非递归算法求二叉树深度、递归算法求二叉树深度、求分支结点个数、判断是否为完全二叉树、先序遍历第k个结点的值、删除值为k的结点及其子树。

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

typedef struct TNode           //二叉树结构体定义
{
	int data;
	struct TNode *lchild, *rchild;
}TNode, *Tree;

typedef struct                 //栈结构体定义
{
	Tree data[100];
	int top;
} Stack;

typedef struct queue           //队列结构体定义
{
	Tree data[100];
	int front, rear;
} queue;

int i = 0;

void create(Tree &T);            //先序创建二叉树
void postorder(Tree T);          //后序递归遍历二叉树
void inorder(Tree T);            //中序非递归遍历二叉树
void levelorder(Tree T);         //层次遍历二叉树
void depth1(Tree T);             //非递归算法求二叉树深度
int depth2(Tree T);              //递归算法求二叉树深度
int  count(Tree T);              //求分支结点(度不为0的结点)个数
int Iscomplete(Tree T);          //判断是否为完全二叉树 
void preorder_k(Tree T, int k);  //先序遍历第k个节点的值
void delete_k(Tree T);           //删除值为k的结点及其子树
void search(Tree T, int k);      //寻找值为k的结点

int main()
{
	int k;
	Tree T;

	printf("创建一棵二叉树:\n");
	create(T);
	printf("后序递归遍历二叉树:\n");
	postorder(T);
	printf("\n");
	printf("中序非递归遍历二叉树:\n");
	inorder(T);
	printf("层次遍历二叉树:\n");
	levelorder(T);
	depth1(T);
	k = depth2(T);
	printf("该二叉树高度为:%d\n", k);
	k = count(T);
	printf("该二叉树分支结点个数为:%d\n", k);
	k = Iscomplete(T);
	if(k == 1)
		printf("该树是完全二叉树!\n");
	else
		printf("该树不是完全二叉树!\n");
	printf("你想知道第几个结点的值?请任意输入一个1-7的正整数。\n");
	scanf("%d", &k);
	preorder_k(T, k);
	printf("你想删除值为几的结点及其子树?请任意输入一个1-7的正整数。\n");
	scanf("%d", &k);
	search(T, k);
	printf("后序递归遍历二叉树:\n");
	postorder(T);
	printf("\n");

	return 1;
}

void create(Tree &T)          //先序创建二叉树
{
	int a;
	scanf("%d", &a);
	if(a != 0)
	{
		T = (Tree)malloc(sizeof(TNode));
		T->data = a;
		create(T->lchild);
		create(T->rchild);
	}
	else
		T=NULL;
}

void postorder(Tree T)           //后序递归遍历二叉树
{
	if(T != NULL)
	{
		postorder(T->lchild);
		postorder(T->rchild);
		printf("%d ", T->data);
	}
}

void inorder(Tree T)            //中序非递归遍历二叉树
{
	Stack S;
	S.top = -1;
	Tree p = T;

	while(p != NULL || S.top != -1)
	{
		while(p != NULL)
		{
			S.data[++S.top] = p;
			p = p->lchild;
		}
		if(S.top != -1)
		{
			p = S.data[S.top--];
			printf("%d ", p->data);
			p = p->rchild;
		}		
	}
	printf("\n");
}

void levelorder(Tree T)         //层次遍历二叉树
{
	queue q;
	q.front =q.rear = 0;
	Tree p = T;
	q.data[q.rear++] = p;
	while(q.front < q.rear)
	{	
		p = q.data[q.front++];	
		printf("%d ", p->data);
		if(p->lchild != NULL)
			q.data[q.rear++] = p->lchild;
		if(p->rchild != NULL)
			q.data[q.rear++] = p->rchild;
	}
	printf("\n");
}

void depth1(Tree T)            //非递归求二叉树深度
{
	int h = 0, last = 0;
	queue q;
	q.front = q.rear = -1;
	Tree p = T;
	q.data[++q.rear] = p;

	while(q.front < q.rear)
	{
		p = q.data[q.front++];
		if(p->lchild)
			q.data[++q.rear] = p->lchild;
		if(p->rchild)
			q.data[++q.rear] = p->rchild;
		if(q.front == last)
		{
			++h;
			last = q.rear + 1;
		}
	}
	printf("该二叉树高度为:%d\n", h);
}

int depth2(Tree T)            //递归求二叉树深度
{
	int h1, h2;
	if(T == NULL)
		return 0;
	else
	{
		h1 = depth2(T->lchild);
		h2 = depth2(T->rchild);
	}

	if(h1 >= h2)
		return h1 + 1;
	else
		return h2 + 1;
}

int count(Tree T)             //递归求分支结点个数
{
	int h1, h2;
	if(T == NULL)
		return 0;
	h1 = count(T->lchild);
	h2 = count(T->rchild);
	
	if(T->lchild != NULL || T->rchild != NULL)
		return h1 + h2 +1;
}

int Iscomplete(Tree T)       //判断是否为完全二叉树
{
	Tree p;
	queue q;
	q.front = q.rear = 0;
	if(!T)
		return 1;
	q.data[q.rear++] = T;
	while(q.front < q.rear)
	{
		p = q.data[q.front++];
		if(p)
		{
			q.data[q.rear++] = p->lchild;
			q.data[q.rear++] = p->rchild;
		}
		else
			while(q.front < q.rear)
			{
				p = q.data[q.front++];
				if(p)
					return 0;
			}
	}
	return 1;
}

void preorder_k(Tree T, int k)   //先序遍历第k个结点的值
{
	if(T != NULL)
	{
		if(++i == k)
			printf("第%d个值为%d!\n", i, T->data);
		preorder_k(T->lchild, k);
		preorder_k(T->rchild, k);
	}
}

void delete_k(Tree T)            //删除值为k的结点及其子树
{
	if(T != NULL)
		{
			delete_k(T->lchild);
			delete_k(T->rchild);
			free(T);
		}
}

void search(Tree T, int k)       //寻找值为k的结点
{
	Tree p;
	queue q;
	q.front = q.rear = -1;
	if(T != NULL)
	{
		if(k == T->data)
		{
			delete_k(T);
			exit(1);
		}
		q.data[++q.rear] = T;
		while(q.front < q.rear)
		{
			p = q.data[++q.front];

			if(p->lchild != NULL)
				if(p->lchild->data == k)
				{	
					delete_k(p->lchild);
					p->lchild = NULL;
				}
				else
					q.data[++q.rear] = p->lchild;

			if(p->rchild != NULL)
				if(p->rchild->data == k)
				{
					delete_k(p->rchild);
					p->rchild = NULL;
				}
				else
					q.data[++q.rear] = p->rchild;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树链式存储结构是通过指针实现的数据结构,每个节点包括一个数据域和两个指针域,分别指向左子树和右子树。下面是二叉树链式存储结构的创建及基本运算。 1. 创建二叉树 二叉树可以通过手动输入或者读入数据来创建。下面是手动输入创建二叉树的代码: ```c++ #include <iostream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void createTree(TreeNode* &root) { int val; cin >> val; if (val == -1) { // 输入-1表示该节点为空 root = NULL; } else { root = new TreeNode(val); createTree(root->left); createTree(root->right); } } ``` 2. 遍历二叉树 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。下面是三种遍历方式的代码实现: ```c++ // 前序遍历 void preOrder(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } // 中序遍历 void inOrder(TreeNode* root) { if (root == NULL) return; inOrder(root->left); cout << root->val << " "; inOrder(root->right); } // 后序遍历 void postOrder(TreeNode* root) { if (root == NULL) return; postOrder(root->left); postOrder(root->right); cout << root->val << " "; } ``` 3. 插入节点 二叉树的插入操作是向二叉树中插入一个新节点。下面是插入操作的代码实现: ```c++ void insertNode(TreeNode* &root, int val) { if (root == NULL) { root = new TreeNode(val); return; } if (val < root->val) { insertNode(root->left, val); } else { insertNode(root->right, val); } } ``` 4. 删除节点 二叉树删除操作是将一个节点从二叉树删除删除操作需要考虑三种情况:删除的节点没有子节点、删除的节点有一个子节点、删除的节点有两个子节点。下面是删除操作的代码实现: ```c++ void deleteNode(TreeNode* &root, int val) { if (root == NULL) return; if (root->val == val) { if (root->left == NULL && root->right == NULL) { // 没有子节点 delete root; root = NULL; } else if (root->left == NULL || root->right == NULL) { // 有一个子节点 TreeNode* temp = root->left ? root->left : root->right; delete root; root = temp; } else { // 有两个子节点 TreeNode* temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; deleteNode(root->right, temp->val); } } else if (val < root->val) { deleteNode(root->left, val); } else { deleteNode(root->right, val); } } ``` 以上是二叉树链式存储结构的创建及基本运算的代码实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值