树结构的常用表示方法
第一个儿子/下一兄弟的表示方法
struct TreeNode
{
Object element;
Treenode *firstchild
Treenode *nextSibling
}
树结构的基本操作
树结构的遍历
前序遍历
对节点的处理工作在其子节点被处理前执行
后续遍历
对节点的处理工作在其子节点被处理后执行
中序遍历
对节点的处理工作在其左节点之后, 右节点之前
AVL(Adelson-Velskii and Landis) 是带有 平衡条件(balance condition) 的 二叉查找树(BST),通过自动调整树的结构,AVL树可以确保查找、插入和删除操作的时间复杂度为 \(O(\log{n})\)。
用来衡量其"平衡程度"的标准是树中某个节点的左右子树的高度差
树的 高度 是指树中 层数 的总数。
AVL树中的每个节点的左右子树高度差(称为平衡因子)最多为1,(这样的约束确保了树的高度在\(O(\log{n})\)范围内)。即左右子树的高度差为 -1、0 或 1。否则,树需要通过旋转操作进行重新平衡。
二叉查找树, 是二叉树在查找中的应用。 使二叉树变为二叉查找树的方法, 是增加一个性质: 对于树中的每个结点Node, 它的左子树中的所有项的值, 都小于X中的项, 而它的右子树中所有的项目的值大于 X 中的项。 其中(小于&大于)仅表达某种的排列规则在结点之间递归传递
template<typename Comparable>
class BinarySearchTree
{
public:
BinarySearchTree();
BinarySearchTree(const BinarySearchTree &node);
~BinarySearchTree();
const Comparable &findMin() const;
const Comparable &findMax() const;
bool contains(const Comparable &node) const;
bool isEmpty() const;
void printTree() const;
void makeEmpty();
void insert(const Comparable &node);
void remove(const Comparable &node);
const BinarySearchTree & operator=(const BinarySearchTree &rhs);
private:
struct BinaryNode
{
Comparable element;
BinaryNode *left;
BinaryNode *right;
BinaryNode(const Comparable &theelement, BinaryNode *lt, BinaryNode *rt): element(theelement), left(lt), right(rt)
}
BinaryNode *root;
// =========== recuris sub progress
void insert(const Comparable &node, BinaryNode *&t) const;
void remove(const Comparable &node, BinaryNode *&t) const;
BinaryNode *findMin(BinaryNode *t) const;
BinaryNode *findMax(BinaryNode *t) const;
bool contains(const Comparable &x, BinaryNode *&t) const;
void makeEmpty(BinaryNode *&t);
void printTree(BinaryNode *t) const;
BinaryNode *clone(BinaryNode *t) const;
}
一颗每个结点的子节点不多于两个
struct BNode
{
Object element; // The data in the node
BNode *left; // Left child
BNode *right; // Right child
}
表达树中的树叶是 操作数(operand)
其他的节点是 操作符(operator)
写一种算法将后缀表达式 转变为 表达式树
将 中缀表达式 转变为 后缀表达式 的算法
从两种常用类型的输入生成表达式树
平衡二叉树(Balanced Binary Tree)是一种二叉树结构,其中任意节点的左右子树的高度差(通常称为平衡因子)不超过1。这种特性确保了树的高度接近于最小,使得在最坏情况下的查找、插入和删除操作的时间复杂度为O(log n),其中n是树中节点的数量。