二叉树总结版

结点的构建

class BiTreeNode {
public:
	char data;//存放数据,结点的数据域
	BiTreeNode* LeftChild;//左子树指针,结点指针域
	BiTreeNode* RightChild;//右子树指针,结点指针域
	BiTreeNode() { LeftChild = NULL; RightChild = NULL; }
	~BiTreeNode(){}
};

树的构建

//树构造
class BiTree {
private:
	BiTreeNode* Root;//根节点指针
	string strTree;//字符串
	int pos;
	BiTreeNode* CreateBiTree();//构造二叉树(先序遍历法)
	void PreOrder(BiTreeNode* t);//先序遍历
	void InOrder(BiTreeNode* t);//中序遍历
	void PostOrder(BiTreeNode* t);//后序遍历
public:
	void CreateTree(string TreeArray);//构造二叉树接口
	void PreOrder();//先序遍历接口
	void InOrder();//中序遍历接口
	void PostOrder();//后序遍历接口
};

利用先序遍历法构造二叉树

//利用先序遍历法构造二叉树
void BiTree::CreateTree(string TreeArray) {//共有函数,对外接口
	pos = 0;
	strTree.assign(TreeArray);//字符串复制
	Root = CreateBiTree();
}
BiTreeNode* BiTree::CreateBiTree() {//递归建树,私有函数,类内实现
	BiTreeNode* T;
	char ch;
	ch = strTree[pos++];//取字符串pos的位置元素,先赋值后加加
	if (ch == '0') {
		T = NULL;
	}
	else {
		T = new BiTreeNode();//构造新结点
		T->data = ch;//数据域赋值
		T->LeftChild = CreateBiTree();//指针域成为新的结点继续构造二叉树
		//左结点先构建完再构建右结点,为先序遍历法
		T->RightChild = CreateBiTree();//指针域成为新的结点继续构造二叉树
	}
	return T;
}

先序遍历法

//先序遍历
void BiTree::PreOrder() {
	PreOrder(Root);
}
void BiTree::PreOrder(BiTreeNode* t) {
	if (t) {
		cout << t->data;
		PreOrder(t->LeftChild);
		PreOrder(t->RightChild);
	}
}

中序遍历法

//中序遍历
void BiTree::InOrder() {
	InOrder(Root);
}
void BiTree::InOrder(BiTreeNode* t) {
	if (t) {
		InOrder(t->LeftChild);
		cout << t->data;
		InOrder(t->RightChild);
	}
}

后序遍历法

//后序遍历
void BiTree::PostOrder() {
	PostOrder(Root);
}
void BiTree::PostOrder(BiTreeNode* t) {
	if (t) {
		PostOrder(t->LeftChild);
		cout << t->data;
		PostOrder(t->RightChild);
	}
}

层次遍历法

### 基本概念 - ****:一种非线性结构,有一个特殊的根节点,是的起点。除根节点外,下面的节点分为很多分支,共同组成形状像倒挂的,根在上,叶子在下的结构[^2]。 - **节点、度和高**:中每一个元素称为节点,每一个节点的子节点数量叫做度,从根节点到最长路径末端子节点的个数是高[^2]。 - **二叉树**:一个有序的任意节点的度不超过 2 的称为二叉树[^2]。 ### 相关结论 - 任何一棵二叉树,若叶节点数为 $n_0$,度为 2 的非叶节点为 $n_2$,则有 $n_0 = n_2 + 1$。 - 完全二叉树中,总结点数为偶数,则一定存在一个结点有左孩子;总结点数为奇数,则有 0 个节点只有左孩子。 - 具有 $n$ 个节点的完全二叉树,由上至下,由左至右从 0 开始编号,则对应序号 $i$ 的节点: - 若 $i > 0$,双亲序号为 $(i - 1) / 2$;$i = 0$ 时,$i$ 为根节点编号,无双亲节点。 - 若 $2i + 1 < n$,左孩子序号为 $2i + 1$,否则无左孩子。 - 若 $2i + 2 < n$,右孩子序号为 $2i + 2$,否则无右孩子。 - 具有 $n$ 个节点的完全二叉树的深度为 $\lceil log_2(n + 1) \rceil$ [^1]。 ### 存储结构 - **顺序结构**:使用数组来存储,一般只适合示完全二叉树,因为不是完全二叉树会有间的浪费。现实中只有堆会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一棵二叉树[^1]。 ### 节点结构体定义示例 ```cpp // 二叉链节点结构体 struct BinaryTreeNode{ int val; // 数据域 BinaryTreeNode* left; // 左子节点指针 BinaryTreeNode* right; // 右子节点指针 }; // 三叉链的结点类模板 template <class T> struct bTreeNode { // 数据成员 T data; // 数据域 bTreeNode<T>* leftChild; // 左孩子 bTreeNode<T>* rightChild; // 右孩子 bTreeNode<T>* parent; // 双亲结点 // 函数成员 bTreeNode(); // 无参的构造函数 bTreeNode(const T &d, bTreeNode<T>* Parent = NULL, bTreeNode<T>* LChild = NULL, bTreeNode<T>* RChild = NULL); // 已知元素、双亲、左右孩子 }; // 无参的构造函数 template <class T> bTreeNode<T>:: bTreeNode() { leftChild = NULL; rightChild = NULL; } // 含参的构造函数 template <class T> bTreeNode<T>:: bTreeNode(const T &d, bTreeNode<T>* Parent, bTreeNode<T>* LChild, bTreeNode<T>* RChild) { data = d; leftChild = LChild; rightChild = RChild; parent = Parent; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值