【数据结构】二叉树(创建、三种遍历方式、深度、结点个数)的实现

先来看一下实现效果:

介绍一下三种遍历方式:

  • 先序遍历:访问 -> 左 -> 右
  • 中序遍历:左 -> 访问 -> 右
  • 后序遍历:左 -> 右 -> 访问 

主要实现方法:递归

#include<iostream>

using namespace std;

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

//先序创建二叉树 
void CreateBiTree(BiTree &T)
{
	char ch;
	cin >> ch;
	if(ch=='#')
		T=NULL;
	else
	{
		T=new BiTNode;
		T->data=ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

//先序遍历 
void PreOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	else
	{
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

//中序遍历 
void InOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	else
	{
		InOrderTraverse(T->lchild);
		cout <<T->data;
		InOrderTraverse(T->rchild);
	}
}

//后序遍历
void PostOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	else
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout <<T->data;
	}
 } 

//复制二叉树 
void Copy(BiTree T,BiTree &NewT)
{
	if(T==NULL)
	{
		NewT=NULL;
		return;
	}
	else
	{
		NewT=new BiTNode;
		NewT->data=T->data;
		Copy(T->lchild,NewT->lchild);
		Copy(T->rchild,NewT->rchild);
	}
}

//计算二叉树的深度 
int Depth(BiTree T)
{
	if(T==NULL)
		return 0;
	else
	{
		int m=Depth(T->lchild);
		int n=Depth(T->rchild);
		if(m>n)
			return m+1;
		else
			return n+1;
	}
}

//统计二叉树中结点的个数
int NodeCount(BiTree T)
{
	if(T==NULL)
		return 0;
	else
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
 } 

int main()
{
	
	BiTree T;
	BiTree A;
	
	CreateBiTree(T);
	cout << "先序遍历: ";
	PreOrderTraverse(T);
	cout <<endl;	
	
	cout << "中序遍历: ";
	InOrderTraverse(T);
	cout <<endl;
	
	cout << "后序遍历: ";
	PostOrderTraverse(T);
	cout << endl;
	
	cout << "复制二叉树T到A: ";
	Copy(T,A);
	PreOrderTraverse(A);
	cout << endl;
	
	cout << "计算二叉树T的深度: ";
	cout << Depth(T) <<endl;
	
	cout << "二叉树中结点个数: ";
	cout << NodeCount(T) <<endl;
	return 0;
}

 

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用数据结构知识用C语言编写完整程序实现二叉树创建遍历深度和叶子节点个数的功能。请参考代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点结构体 typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建二叉树 TreeNode *create_tree() { int value; scanf("%d", &value); if (value == -1) { // 结束标志 return NULL; } TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->data = value; node->left = create_tree(); node->right = create_tree(); return node; } // 先序遍历二叉树 void preorder_traversal(TreeNode *node) { if (node == NULL) { return; } printf("%d ", node->data); preorder_traversal(node->left); preorder_traversal(node->right); } // 中序遍历二叉树 void inorder_traversal(TreeNode *node) { if (node == NULL) { return; } inorder_traversal(node->left); printf("%d ", node->data); inorder_traversal(node->right); } // 后序遍历二叉树 void postorder_traversal(TreeNode *node) { if (node == NULL) { return; } postorder_traversal(node->left); postorder_traversal(node->right); printf("%d ", node->data); } // 二叉树深度 int tree_depth(TreeNode *node) { if (node == NULL) { return 0; } int left_depth = tree_depth(node->left); int right_depth = tree_depth(node->right); return left_depth > right_depth ? left_depth + 1 : right_depth + 1; } // 二叉树叶子结点个数 int leaf_count(TreeNode *node) { if (node == NULL) { return 0; } if (node->left == NULL && node->right == NULL) { return 1; } return leaf_count(node->left) + leaf_count(node->right); } int main() { // 创建二叉树 printf("请输入二叉树每个节点的值,-1表示此节点为空:\n"); TreeNode *root = create_tree(); // 先序遍历二叉树 printf("先序遍历二叉树:\n"); preorder_traversal(root); printf("\n"); // 中序遍历二叉树 printf("中序遍历二叉树:\n"); inorder_traversal(root); printf("\n"); // 后序遍历二叉树 printf("后序遍历二叉树:\n"); postorder_traversal(root); printf("\n"); // 二叉树深度 printf("二叉树深度为:%d\n", tree_depth(root)); // 二叉树叶子结点个数 printf("二叉树叶子结点个数为:%d\n", leaf_count(root)); return 0; } ``` 程序运行结果: ``` 请输入二叉树每个节点的值,-1表示此节点为空: 1 2 -1 -1 3 4 -1 -1 5 -1 -1 先序遍历二叉树: 1 2 3 4 5 中序遍历二叉树: 2 1 4 3 5 后序遍历二叉树: 2 4 5 3 1 二叉树深度为:3 二叉树叶子结点个数为:3 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值