数据结构--二叉树及其基本操作

本文深入解析二叉树的基本概念,包括递归定义、关键术语如深度和高度,以及三种主要遍历方法:前序、中序和后序遍历。同时,通过实例演示了如何使用C++创建二叉树并实现遍历算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树总结

树的概念(递归定义):树是一些节点的集合,这个集合可以为空,若非空,则它由一个根节点r和0个或多个非空的(子)树组成,这些子树中每一棵的根都被来自根 r 的一条有向的边所连接。

树叶(leaf):没有儿子的节点;

兄弟(sibling):具有相同父亲的节点;类似还有祖父和孙子节点。

路径:从节点n1到nk的路径定义为节点n1,n2,n3,...,nk的一个序列,使得对于 1 <= i < k 节点ni是ni+1的父亲;路径的长为路径上边的数量,即K-1。

深度(depth):某节点的深度为树根到该节点的唯一路径的长度。根节点的深度为0

高度(height):节点 ni 的高度为 ni 到一片树叶的最长路径的长。树叶的高度都是0

树的高度:一棵树的高等于它的根的高。

树的深度:一棵树的深度等于它的最深的树叶的深度。

树的深度总是等于这棵树的高度

二叉树:二叉树是一种特殊的树,其中每个节点都不能有多于两个的儿子。

二叉树的定义(递归定义):二叉树是一些节点的集合,要么为空;要么有一个根节点和两棵子二叉树构成。(子树也是二叉树,也可以为空)

 

#include <iostream>

using namespace std;

typedef struct BTNode {
	char val;
	struct BTNode *left, *right;
	BTNode(char x) :
		val(x), left(nullptr), right(nullptr) {
	}
}BTNode, *BTree;

//创建一棵二叉树
BTree createTree() {
	BTree pA = new BTNode('A');
	BTree pB = new BTNode('B');
	BTree pC = new BTNode('C');
	BTree pD = new BTNode('D');
	BTree pE = new BTNode('E');
	BTree pF = new BTNode('F');

	pA->left = pC;
	pA->right = pB;
	pC->left = pD;
	pC->right = pE;
	pB->right = pF;

	return pA;
}

//前序遍历此树:根  左  右
void preOrder(BTree pT) {
	//如果pT == nullptr,则什么也不做
	if (pT != nullptr) {
		//此处打印其值,也可以执行其他操作
		cout << pT->val;

		preOrder(pT->left);
		preOrder(pT->right);
	}
}

//中序遍历此树:左  根  右
void inOrder(BTree pT) {
	if (pT != nullptr) {
		inOrder(pT->left);

		cout << pT->val;

		inOrder(pT->right);
	}
}

//后序遍历此树:左  右  根
void postOrder(BTree pT) {
	if (pT != nullptr) {
		postOrder(pT->left);
		postOrder(pT->right);

		cout << pT->val;
	}
}

/*  
求树的深度,这里树的深度看你怎么定义了
《数据结构与算法分析》中定义一棵树的深度为它的最深的树叶的
深度,根节点的深度为0,即书的深度等于层数减一,以下实现是根节点的深度为1
*/
int getDepth(BTree pT) {
	int LD, RD;
	if (pT == nullptr) {
		return 0;
	}
	else {
		LD = getDepth(pT->left);
		RD = getDepth(pT->right);
		return (LD > RD ? LD : RD) + 1;
	}
}

//前序遍历查找key,q存储值等于key的元素的指针,如果没找到,则等于nullptr
void preSearch(BTree pT, BTNode *&q, char key) {
	if (pT != nullptr) {
		if (pT->val == key) {
			q = pT;
		}
		else {
			preSearch(pT->left, q, key);
			if (q == nullptr) {
				preSearch(pT->right, q, key);
			}
		}
	}
}

//中序遍历查找key
void inSearch(BTree pT, BTNode *&q, char key) {
	if (pT != nullptr) {
		inSearch(pT->left, q, key);
		if (q == nullptr) {
			if (pT->val == key) {
				q = pT;
			}
			else {
				inSearch(pT->right, q, key);
			}
		}
	}
}

//后序遍历查找key
void postSearch(BTree pT, BTNode *&q, char key) {
	if (pT != nullptr) {
		postSearch(pT->left, q, key);
		if (q == nullptr) {
			postSearch(pT->right, q, key);
			if (q == nullptr && pT->val == key) {
				q = pT;
			}
		}
	}
}

int main() {
	BTree pTree = createTree();
	char key;
	BTNode *q = nullptr;

	cout << "前序序列:";
	preOrder(pTree);
	cout << endl;

	cout << "中序序列:";
	inOrder(pTree);
	cout << endl;

	cout << "后序序列:";
	postOrder(pTree);
	cout << endl;

	cout << "二叉树的深度:";
	cout << getDepth(pTree) << endl;

	cout << "请输入要查找的值(A-Z):";
	cin >> key;

	preSearch(pTree, q, key);
	if (q != nullptr) {
		cout << "前序查找成功" << endl;
	}
	else {
		cout << "前序查找失败" << endl;
	}

	inSearch(pTree, q, key);
	if (q != nullptr) {
		cout << "中序查找成功" << endl;
	}
	else {
		cout << "中序查找失败" << endl;
	}

	postSearch(pTree, q, key);
	if (q != nullptr) {
		cout << "后序查找成功" << endl;
	}
	else {
		cout << "后序查找失败" << endl;
	}

	return 0;
}

output:

前序序列:ACDEBF
中序序列:DCEABF
后序序列:DECFBA
二叉树的深度:3
请输入要查找的值(A-Z):A
前序查找成功
中序查找成功
后序查找成功
请按任意键继续. . .

 

参考:https://blog.youkuaiyun.com/wardseptember/article/details/78872111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值