数据结构 简单算法实现在二叉排序树上查找关键值k

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 简单算法实现在二叉排序树上查找关键值k相关的知识,希望对你有一定的参考价值。

typedef struct nodeint key; struct node *lchild; struct node *rchild;bitree; bitree *bstsearch(bitree *t, int k) if (t==0 ) return(0);else while (t!=0) if (t->key==k) return(t); else if (t->key>k) t=t->lchild; else_t=t->rchild_; 整个程序什么意思 看不懂

参考技术A 如果用C语言,应该要写成这样:
typedef
struct
nodeint
key;
struct
node
*lchild;
struct
node
*rchild;bitree;
bitree
*bstsearch(bitree
*t,
int
k)

if
(t==NULL
)
//这里t是一个指针,是不能跟0判等的,要和空指针判等

return(NULL);//如果t是空指针,表示数是空数,不存在关键值key

else

while
(t!=NULL)//要循环遍历整个树,寻找关键值key

if
(t->key==k)
//如果找到了关键值key,则返回节点指针t
return(t);
else
if
(t->key>k)
//因为是排序树,则有对于任意节点,左孩子小于根小于右孩子
t=t->lchild;
//所以如果当前节点的key大于输入值,则搜索左子树,否则右子树
else
t=t->rchild_;

return
NULL;//这里要加这个,如果搜索不到的话要返回空指针

在二叉查找树中插入节点

给定一棵二叉查找树和一个新的树节点,将节点插入到树中。

你需要保证该树仍然是一棵二叉查找树。

给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的:

  2             2
 / \\           / \\
1   4   -->   1   4
   /             / \\ 
  3             3   6

 

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
 
如图所示:
 
 1 <?php
 2 //二叉查找树
 3 include "show.php";//实现了一个打印的方法
 4 
 5 class tree{
 6     public $value;
 7     public $left = null;
 8     public $right = null;
 9     
10     public function __construct($value)
11     {
12         $this->value = $value;
13     }
14 }
15 
16 /**
17  * $header树的根节点
18  */
19 function add(&$header)
20 {
21     $nodes = [2, 1, 4, 3, 6];
22     foreach($nodes as $v)
23     {
24         insert_node($header, $v);
25     }
26 }
27 
28 //二叉查找树插入节点(非递归), 插入的节点均为叶子节点
29 function insert_node(&$header, $node)
30 {
31     //处理只有一个节点的情况
32     if($header == null)
33     {
34         $header = new tree($node);
35         return;
36     }
37     
38     //处理有多个节点的情况
39     $p = $header;
40     $pre = $header;
41     while($p != null)
42     {
43         $pre = $p;
44         if($node < $p->value)
45         {
46             $p = $p->left;
47         } else {
48             $p = $p->right;
49         }
50     }
51     //循环完之后,$pre即为$node的父节点
52     if($node < $pre->value)
53     {
54         $pre->left = new tree($node);
55     } else {
56         $pre->right = new tree($node);
57     }
58 }
59 
60 //二叉查找树插入节点(递归)
61 function tmp_insert_node($header, $node)
62 {
63     $tmp_node = new tree($node);
64     if($header == null)
65     {
66         $header = $tmp_node;
67         return $header;
68     }
69     
70     if($node < $header->value)
71     {
72         $header->left = tmp_insert_node($header->left, $node);
73     } else {
74         $header->right = tmp_insert_node($header->right, $node);
75     }
76     return $header;
77 }
78 
79 $header = null;
80 add($header);//非递归
81 show($header);
82 
83 $res = tmp_insert_node($header, 5);//递归
84 show($res);
85 $res = tmp_insert_node($header, 7);
86 show($res);

 

以上是关于数据结构 简单算法实现在二叉排序树上查找关键值k的主要内容,如果未能解决你的问题,请参考以下文章

《算法导论》读书笔记

C++ 树进阶系列之平衡二叉查找树( AVL)的自平衡算法

数据结构——二叉查找树

算法系列数据结构之二叉查找树

二叉搜索树

每周算法平衡二叉树