📜  数据结构-二叉树(1)

📅  最后修改于: 2023-12-03 15:40:00.700000             🧑  作者: Mango

数据结构-二叉树

简介

二叉树是一种重要的树形数据结构,其中每个节点最多只能有两个子节点,分别称为左子节点和右子节点,且左子节点的值小于右子节点的值。二叉树的应用非常广泛,例如搜索树、红黑树、AVL树等。在程序设计中,需要经常操作二叉树,因此熟悉二叉树的基本结构和操作方法是非常重要的。

基本结构

二叉树由节点组成,每个节点包含数据和两个子节点的指针。具体实现中,可以用类或结构体来表示节点。以下是一个二叉树节点的定义的C++代码片段:

template <typename T>
struct TreeNode {
    T val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(T x) : val(x), left(nullptr), right(nullptr) {}
};
特殊类型

在二叉树中,有几种特殊的节点类型。

根节点

根节点是二叉树的最顶层节点,它没有父节点。大多数二叉树的根节点只有一个。

叶子节点

叶子节点是没有子节点的节点,它们是二叉树的最底层节点。

内部节点

内部节点是既不是根节点也不是叶子节点的节点,它们有至少一个子节点。

祖先节点

祖先节点是从根节点到该节点的路径上所经过的所有节点,包括该节点本身。

子孙节点

子孙节点是该节点的所有后代节点。

基本操作
二叉树遍历

遍历是指按照一定的顺序访问二叉树的每个节点。遍历分为三种:

  1. 先序遍历(preorder traversal):按照从根节点开始,先访问根节点,再递归地访问左子树和右子树;

  2. 中序遍历(inorder traversal):按照从左到右的顺序,递归地访问左子树、根节点和右子树;

  3. 后序遍历(postorder traversal):按照从左到右的顺序,递归地访问左子树、右子树和根节点。

以下是一个二叉树的先序遍历的C++代码片段:

template <typename T>
void preorderTraversal(TreeNode<T>* root) {
    if (root == nullptr) return;
    cout << root->val << " ";
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}
二叉树查找

查找是指在二叉树中查找某个值。以下是一个二叉树查找的C++代码片段:

template <typename T>
bool searchBST(TreeNode<T>* root, T val) {
    if (root == nullptr) return false;
    if (root->val == val) return true;
    else if (root->val > val) return searchBST(root->left, val);
    else return searchBST(root->right, val);
}
二叉树节点插入

插入是指向二叉树中插入一个新节点。以下是一个二叉树节点插入的C++代码片段:

template <typename T>
TreeNode<T>* insertIntoBST(TreeNode<T>* root, T val) {
    if (root == nullptr) return new TreeNode<T>(val);
    if (root->val > val) root->left = insertIntoBST(root->left, val);
    else root->right = insertIntoBST(root->right, val);
    return root;
}
总结

以上是二叉树的基本结构和操作方法。熟练掌握二叉树的基本结构和操作方法可以极大地提高程序员的编程水平,使其能够更好地编写高效、可靠的程序。