设为首页 加入收藏

TOP

树基本概念及用法(二)
2023-07-23 13:28:30 】 浏览:78
Tags:
nt所处位置即为要插入结点的父结点
32 } 33 if (node->data < parent->data) { 34 parent->lchild = node; 35 } 36 else { 37 parent->rchild = node; 38 } 39 return true; 40 }

3.2二叉搜索树删除结点

将要删除的节点的值,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以上操作直到找到一个节点的值等于删除的值,则将此节点删除。删除时有 4 中情况须分别处理:

 1.删除节点不存在左右子节点,即为叶子节点,直接删除

 

 2.删除节点存在左子节点,不存在右子节点,直接把左子节点替代删除节点

 

  3.删除节点存在右子节点,不存在左子节点,直接把右子节点替代删除节点

 

 4.删除节点存在左右子节点,则取左子树上的最大节点或右子树上的最小节点替换删除节点。

 

 代码实现:

 1 //查找左子树最大值
 2 int findLeftMax(Btree* root) {
 3     /*采用递归方式查找
 4     * if (root->rchild == NULL)
 5         return root->data;
 6     return findMax(root->rchild);
 7     */
 8     //采用循环查找
 9     Btree indexNode = *root;
10     while (indexNode->rchild)
11         indexNode = indexNode->rchild;
12     return indexNode->data;
13 }
14  
15  
16 //采用递归的方式删除结点
17 /*
18     这种递归方式,是将要修改的结点的一层一层的返回
19 */
20 Btree deleteNode(Btree* root, int value) {
21     Btree compareNode = *root;        
22     //节点为空(递归找不到value/根节点为空),直接返回
23     if (!compareNode)return compareNode;            
24     //大于
25     if (compareNode->data > value) {
26         //左子树重新被赋值
27         compareNode->lchild = deleteNode(&(compareNode->lchild), value);        
28         return compareNode;                                                                
29     }
30     //小于
31     else if (compareNode->data < value) {        
32         //右子树重新被赋值
33         compareNode->rchild = deleteNode(&(compareNode->rchild), value);        
34         return compareNode;
35     }
36     else {//等于                                            
37         Btree temp = NULL;
38         //无左右子节点,直接返回NULL
39         if (compareNode->lchild == NULL && compareNode->rchild == NULL) {        
40             delete compareNode;
41         }
42         //有左子树,返回左子树
43         else if (compareNode->lchild && compareNode->rchild == NULL) {            
44             temp = compareNode->lchild;
45             delete compareNode;
46         }
47         //有右子树,返回右子树
48         else if (compareNode->rchild && compareNode->lchild == NULL) {            
49             temp = compareNode->rchild;
50             delete compareNode;
51         }
52         else {                                            
53             //这里采用左子树最大值替换                
54             int leftMax = findLeftMax(&(compareNode->lchild));                
55             //最大值替换删除结点的值
56             compareNode->data = leftMax;                                        
57             //将最大值从树中删除
58             compareNode->lchild = deleteNode(&(compareNode->lchild), leftMax);
59             temp= compareNode;
60         }
61         return temp;
62     }
63 }

3.3二叉搜索树查找 

 1 // 采用递归方式查找结点
 2 /*
 3 Bnode* queryByRec(Btree root, int value) {
 4     if (root == NULL || root->data==value ){
 5         return root;
 6     }
 7     else if (root->data < value) {
 8         return queryByRec(root->lchild, value);
 9     }
10     else {
11         return queryByRec(root->rchild, value);
12     }
13 }*/
14  
15 // 使用非递归方式查找结点
16  
17 Bnode* queryByLoop(Btree root, int value) {
18     while (root != NULL && root->data!=value) {
19         if (root->data>value) {
20             root = root->lchild;
21         }
22         else {
23             root = root->rchild;
24         }
25     }
26     return root;
27 }

3.4二叉搜索树遍历结点

3.4.1前序遍历

前序遍历,简单来说就是遍历根-左孩子-右孩子

 

如上图,前序遍历的结果为 19 7 5 11 15 25 21 61

 

1 void PreOrderRec(int x)//x为根节点
2 {
3     if (x == 0)return;//若遍历完成,返回函数
4     cout<<x;
5     PreOrderRec(a[x].left);//遍历左孩子
6     PreOrderRec(a[x].right);//遍历右孩子
7 }

3.4.2中序遍历

中序遍历,相当于遍历左-根-右

  

 

 还是这个图,但中序遍历的结果为 5 7 11 15 19 21 25 61

1 void PreOrderRec(int x)//x为根节点
2 {
3     if (x == 0)return;//若遍历完成,返回函数
4     PreOrderRec(a[x].left);//遍历左孩子
5     cout<<x; 
6     PreOrderRec(a[x].right);//遍历右孩子
7 }

甚至代码都不需要改,只需改变遍历的顺序

3.4.3后序遍历

后序遍历,也就是左-右-根

 

 后序遍历结果为  

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇最佳实践:二进制数据处理与封装 下一篇用C++实现插件模式时的避坑要点

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目