二叉树操作(1)—— 基础部分

二叉树基础操作

  1. 建立二叉树(这里用先序)
  2. 二叉树的先序遍历
  3. 二叉树的中序遍历
  4. 二叉树的后序遍历
  5. 测量二叉树深度
  6. 统计二叉树的节点个数
  7. 统计二叉树的叶子节点个数

所有操作均以递归形式非递归的太麻烦了🐶

测试用例:
在这里插入图片描述

#include <iostream>
#include <stack>
#include <algorithm>

using namespace std;

typedef struct Node                          //定义二叉树结构
{
	char val;
	struct Node* leftchild, * rightchild;
}*Bitree,BiNode;

void Create_Bitree(Bitree& T)              //先序建立二叉树
{
	char ch;
	cin >> ch;
	if (ch == '#') T = NULL;             //设计终止符
	else
	{
		T = new BiNode;
		T->val = ch;
		Create_Bitree(T->leftchild);
		Create_Bitree(T->rightchild);
	}
}

void PreOrderTraverse(Bitree T)            //先序遍历(先节点数据,再左子树,再右子树)
{
	if (T)
	{
		cout << T->val << ' ';
		PreOrderTraverse(T->leftchild);
		PreOrderTraverse(T->rightchild);
	}
	
}

void InOrderTraverse(Bitree T)             //中序遍历(先左子树,再节点数据,再右子树)
{
	if (T)
	{
		InOrderTraverse(T->leftchild);
		cout << T->val << ' ';
		InOrderTraverse(T->rightchild);
	}
	
}

void PostOrderTraverse(Bitree T)           //后续遍历(先左子树,再右子树,再节点数据)
{
	if (T)
	{
		PostOrderTraverse(T->leftchild);
		PostOrderTraverse(T->rightchild);
		cout << T->val << ' ';
	}
	
}


int Deep_Bitree(Bitree T)                          //测量二叉树深度
{
	if (T == NULL) return 0;
	else
	{
		int left_depth = Deep_Bitree(T->leftchild);
		int right_depth = Deep_Bitree(T->rightchild);
		int depth = max(left_depth, right_depth) + 1;
		return depth;
	}
}

int Count_Node(Bitree T)                       //统计二叉树中所有节点个数
{
	if (T == NULL) return 0;
	else
	{
		int leftnum = Count_Node(T->leftchild);
		int rightnum = Count_Node(T->rightchild);
		return (leftnum + rightnum + 1);
	}
}

int Count_Leaf(Bitree T)                      //统计二叉树中叶子节点个数
{
	if (T == NULL)return 0;
	else if (!T->leftchild && !T->rightchild) return 1;
	else
	{
		int leftleaf = Count_Leaf(T->leftchild);
		int rightleaf = Count_Leaf(T->rightchild);
		return (leftleaf + rightleaf);
	}
}




int main()
{
	Bitree T;
	cout << "先序遍历创建树,请输入(以‘#’结束): " << endl;
	Create_Bitree(T);       //创建二叉树
	cout << "先序遍历结果:" << endl;
	PreOrderTraverse(T);    //先序遍历二叉树
	cout << endl;

	cout << "中序遍历结果:" << endl;
	InOrderTraverse(T);     //中序遍历二叉树
	cout << endl;

	cout << "后序遍历结果:" << endl;
	PostOrderTraverse(T);   //后序遍历二叉树
	cout << endl;

	cout << "二叉树的深度:" << Deep_Bitree(T) << endl;            //测量二叉树的深度
	cout << "二叉树节点个数:" << Count_Node(T) << endl;           //计算二叉树节点的个数
	cout << "二叉树叶子节点个数:" << Count_Leaf(T) << endl;       //计算二叉树叶子节点的个数

}



测试结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值