软考
APP下载

二叉树的代码实现

二叉树是一种数据结构,它由一个根节点和两个子树组成。每个节点最多只有两个子节点,称为“左子树”和“右子树”。二叉树可以用来解决许多问题,如查找、排序和数据压缩等。本文将从多个角度分析二叉树的代码实现。

1. 二叉树节点的定义

二叉树节点通常包括三个属性:值、左子节点和右子节点。它可以用一个结构体来表示,如下所示:

```

struct Node {

int val;

Node* left;

Node* right;

};

```

其中,`val`是节点的值,`left`和`right`是指向该节点左右子节点的指针。如果该节点没有左子节点或者右子节点,则相应指针为`null`。

2. 二叉树的创建

在二叉树中,每个节点的左右子树也是一棵二叉树。通过递归的方式,可以创建一棵二叉树。下面是一个简单的示例代码:

```

Node* create(int val) {

Node* root = new Node;

root->val = val;

root->left = NULL;

root->right = NULL;

return root;

}

void insert(Node* root, int val) {

if (root == NULL) {

root = create(val);

} else if (val < root->val) {

if (root->left == NULL) {

root->left = create(val);

} else {

insert(root->left, val);

}

} else {

if (root->right == NULL) {

root->right = create(val);

} else {

insert(root->right, val);

}

}

}

Node* build(vector & nums) {

Node* root = NULL;

for (int num : nums) {

insert(root, num);

}

return root;

}

```

上述代码定义了`create`函数来创建一个新的节点,同时定义了`insert`函数来递归地插入节点。最终,通过`build`函数将给定的一组数值构建成一棵二叉树。

3. 二叉树的遍历

遍历是对二叉树中的节点进行访问的过程。常见的遍历方式有三种,分别是前序遍历、中序遍历和后序遍历。这三种遍历方式的区别在于节点的访问顺序不同。

- 前序遍历:先访问根节点,再访问左子树,最后访问右子树。

- 中序遍历:先访问左子树,再访问根节点,最后访问右子树。

- 后序遍历:先访问左子树,再访问右子树,最后访问根节点。

下面是一段进行中序遍历的代码:

```

void inorder(Node* root) {

if (root == NULL) {

return;

}

inorder(root->left);

cout << root->val << " ";

inorder(root->right);

}

```

这段代码递归地对二叉树进行中序遍历,其中`cout`语句用于输出经过的节点值。

4. 二叉树的查找

对于给定的值,可以通过遍历二叉树来查找是否存在该值的节点。下面是一段进行二叉查找的代码:

```

Node* search(Node* root, int val) {

if (root == NULL || root->val == val) {

return root;

}

if (val < root->val) {

return search(root->left, val);

} else {

return search(root->right, val);

}

}

```

这段代码使用递归的方式对二叉树进行查找,如果找到节点,则返回该节点,否则返回`null`。

5. 二叉树的删除

二叉树中的节点可以被删除。如果要删除一个节点,需要考虑其是否有子节点,同时需要保证删除节点后仍然保持二叉树的性质。下面是一段进行二叉删除的代码:

```

Node* deleteNode(Node* root, int key) {

if (root == NULL) {

return root;

}

if (key < root->val) {

root->left = deleteNode(root->left, key);

} else if (key > root->val) {

root->right = deleteNode(root->right, key);

} else {

if (root->left == NULL) {

Node* temp = root->right;

delete root;

return temp;

} else if (root->right == NULL) {

Node* temp = root->left;

delete root;

return temp;

}

Node* temp = minNode(root->right);

root->val = temp->val;

root->right = deleteNode(root->right, temp->val);

}

return root;

}

```

这段代码递归地对二叉树进行删除。如果删除的节点没有子节点,直接删除该节点即可。如果删除的节点只有一个子节点,则将该子节点和它的子树移动到删除节点的位置。如果删除的节点有两个子节点,则将该节点的右子树中的最小值替换成该节点,并递归地删除该最小值节点。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库