453 字
2 分钟
二叉树
树
树是一种常见的数据结构,在许多地方都有使用
二叉树则是其中更加广泛使用的一种树
二叉树
一个常见的二叉树节点的定义是这样的:
template<typename T>struct Node { T element; Node* left = nullptr; Node* right = nullptr;}一个二叉树节点内有两个特殊的成员:left 和 right 用于指向其下的子节点
一些二叉树的特性
- 深度 从根节点开始延伸下来到目标节点的经过的边数
- 高度 从目标节点开始向下到最远的叶子节点的层数
形象理解,对于下面的这个二叉树:
对于其节点B:
- 深度:从A开始到B只有一条边,所以深度为1
- 高度:从B往下的最远的叶子节点是F,中间有两层,所以高度为2
二叉树最值得注意的便是它的各种遍历:
先序遍历
void preorderTraversal() { std::cout << element; if (left && !leftThread) { left->preorderTraversal(isTidy); } if (right && !rightThread) { right->preorderTraversal(isTidy); }}先序遍历,就是先访问该节点下的元素后,再访问其各个子节点的方式
后序遍历
void postorderTraversal() { if (left && !leftThread) { left->postorderTraversal(isTidy); } if (right && !rightThread) { right->postorderTraversal(isTidy); } std::cout << element;}后序遍历,就是先访问该节点下的两个子节点后,再访问自己所拥有的元素的方式
中序遍历
void inorderTraversal() { if (left && !leftThread) { left->inorderTraversal(isTidy); } std::cout << element; if (right && !rightThread) { right->inorderTraversal(isTidy); }}中序遍历,就是按照:左 -> 中 -> 右 的顺序依次访问,其中所谓的“中”便是该节点本身
三种遍历之间的关系
需要知道的是:确定中序遍历 + 先序遍历或者后续遍历即可确定一个二叉树的结构