希赛考试网
首页 > 软考 > 软件设计师

二叉树的代码实现

希赛网 2024-01-30 16:58:36

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

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;

}

```

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

微信扫一扫,领取最新备考资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考报考咨询

微信扫一扫,定制学习计划