zoukankan      html  css  js  c++  java
  • 在二叉查找树中插入节点

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

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

    给出如下一棵二叉查找树,在插入节点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);
  • 相关阅读:
    小程序注册
    Webpack
    npm总结1
    js事件
    js高级程序2
    js高级程序
    索引
    将数据渲染到页面的方法
    前后端分离后,通讯问题 springboot + vue
    axios post 请求后端参数为null解决方案
  • 原文地址:https://www.cnblogs.com/573583868wuy/p/8983060.html
Copyright © 2011-2022 走看看