通俗易懂二叉树递归遍历

二叉树的递归遍历

/*
采用双链表作为存贮结构,完成二叉树的建立;给出先序、中序、和后序遍历算法;给出求二叉树所有结点个数、叶子结点个数及树高度的算法),并设计一棵二叉树测试运行效果。
1)构建要求:给出二叉树扩充的先序序列,唯一地构造一棵二叉树。
2)数据要求:树中每个结点的数据类型设定为整型。
3)遍历算法要求:三种遍历都采用递归算法。
*/

#include<iostream>
#include<stdio.h>
#define MAX 100

typedef struct BTreeNode {
	int data;
	BTreeNode *Lchild, *Rchild;
}Bnode, *ptr;

class BTree
{
public:
	ptr getRoot()
	{
		return root;
	}
	void Create() //构造二叉树的对外接口
	{
		createBTree(root);
	}
	void inOrder(ptr tree); //中序遍历
	void preOrder(ptr tree); //先序遍历
	void postOrder(ptr tree); //后序遍历
	int BTreeSize(ptr tree); //结点个数
	int BTreeLeaves(ptr tree); //叶子结点
	int BTreeHeight(ptr tree); //树高
private:
	ptr root;
	void createBTree(ptr &tree); //根据扩充序列构建二叉树
};

void BTree::inOrder(ptr tree)
{
	if (!tree)
		return;
	// 遍历左子树
	inOrder(tree->Lchild);
	// 打印根节点
	cout << tree->data << " ";
	// 遍历右子树
	inOrder(tree->Rchild);
}

void BTree::preOrder(ptr tree)
{
	if (!tree)
		return;
	// 打印根节点
	cout << tree->data << " ";
	// 遍历左子树
	preOrder(tree->Lchild);
	// 遍历右子树
	preOrder(tree->Rchild);
}

void BTree::postOrder(ptr tree)
{
	if (!tree)
		return;
	// 遍历左子树
	postOrder(tree->Lchild);
	// 遍历右子树
	postOrder(tree->Rchild);
	// 打印根节点
	cout << tree->data << " ";
}

int BTree::BTreeSize(ptr tree)
{
	if (!tree)
		return 0;
	// 遍历左右子树到底
	// 每返回一个+1, Size = 左右子树的和 + 1
	return BTreeSize(tree->Lchild)+ BTreeSize(tree->Rchild) + 1;
}

int BTree::BTreeLeaves(ptr tree)
{
	// 根节点不算叶子结点
	if (!tree) return 0;
	// 左右子树都为NULL
	if (tree->Lchild == NULL && tree->Rchild == NULL)
		return 1;
	else
		return BTreeLeaves(tree->Lchild) + BTreeLeaves(tree->Rchild);
}

int BTree::BTreeHeight(ptr tree)
{
	// 左右子树每遍历一次+1,最后取最大值+1
	if (!tree)
		return 0;

	return (BTreeHeight(tree->Lchild) > BTreeHeight(tree->Rchild)) ? BTreeHeight(tree->Lchild) + 1 : BTreeHeight(tree->Rchild) + 1;

}

ptr NewNode(int data)
{
	ptr newNode = new Bnode;
	newNode->data = data;
	newNode->Lchild = NULL;
	newNode->Rchild = NULL;
	return newNode;
}

//如果结点data为0, 则为空结点
void BTree::createBTree(ptr &tree)
{
	int data;

	cin >> data;
	if (data == 0)
	{
		//结点等于零, 为空结点
		tree = NULL;
		return;
	}
	else
	{
		tree = NewNode(data);
		createBTree(tree->Lchild);
		createBTree(tree->Rchild);
	}
}

void main()
{
	cout << "请输入一个扩充序列: " << endl;
	BTree tree =BTree();
	tree.Create();
	cout << "扩充完成" << endl;

	cout << "先序遍历:";
	tree.preOrder(tree.getRoot());
	cout << endl;

	cout << "中序遍历:";
	tree.inOrder(tree.getRoot());
	cout << endl;

	cout << "后序遍历:";
	tree.postOrder(tree.getRoot());
	cout << endl;

	cout << "全部结点个数:";
	cout << tree.BTreeSize(tree.getRoot());
	cout << endl;

	cout << "叶子结点个数: ";
	cout << tree.BTreeLeaves(tree.getRoot());
	cout << endl;

	cout << "树的深度:";
	cout << tree.BTreeHeight(tree.getRoot());
	cout << endl;

	getchar();
	getchar();
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值