zoukankan      html  css  js  c++  java
  • binary search tree study

    今天又写了delete的部分,时间就这么被一天天地浪费了,我感到十分惋惜呀
     1 #pragma once
     2 #include "stdio.h"
     3 
     4 struct Node
     5 {
     6     Node(int aValue)
     7         :m_Value(aValue)
     8         ,m_pLeft(NULL)
     9         ,m_pRight(NULL)
    10         ,m_pParent(NULL)
    11     {
    12 
    13     }
    14     int m_Value;
    15     Node* m_pLeft;
    16     Node* m_pRight;
    17     Node* m_pParent;
    18 };
    19 
    20 class BinarySearchTree
    21 {
    22 public:
    23     BinarySearchTree(void);
    24     ~BinarySearchTree(void);
    25     void Init();
    26     void Insert(int aValue);
    27     void Delete(int aValue);
    28     Node* MaxNode(Node* apNode);
    29     Node* MinNode(Node* apNode);
    30     Node* Search(int aValue);
    31 
    32     void PreOrderPrint();
    33     void AfterOrderPrint();
    34     void MidOrderPrint();
    35 
    36     void PrintNode( Node* lpNode ) 
    37     {
    38         printf("%d ", lpNode->m_Value);
    39     }
    40 
    41     Node* Successor(Node* aNode);
    42 
    43 private:
    44     Node* m_pRootNode;
    45 };
    View Code
      1 #include "BinarySearchTree.h"
      2 #include <stack>
      3 #include <queue>
      4 
      5 BinarySearchTree::BinarySearchTree(void)
      6 :m_pRootNode(NULL)
      7 {
      8 }
      9 
     10 BinarySearchTree::~BinarySearchTree(void)
     11 {
     12 }
     13 
     14 void BinarySearchTree::Insert( int aValue )
     15 {
     16     Node* lpNewNode = new Node(aValue);
     17     if (NULL == m_pRootNode)
     18     {
     19         m_pRootNode = lpNewNode;
     20     }
     21     else
     22     {
     23         Node* lpNode = m_pRootNode;
     24         Node* lpPNode = NULL;
     25 
     26         while(lpNode)
     27         {
     28             lpPNode = lpNode;
     29             if (lpNode->m_Value > aValue)
     30             {
     31                 lpNode = lpNode->m_pLeft;
     32             }
     33             else
     34             {
     35                 lpNode = lpNode->m_pRight;
     36             }
     37         }
     38 
     39         if (lpPNode->m_Value > aValue)
     40         {
     41             lpPNode->m_pLeft = lpNewNode;
     42         }
     43         else
     44         {
     45             lpPNode->m_pRight = lpNewNode;
     46         }
     47         lpNewNode->m_pParent = lpPNode;
     48     }
     49 }
     50 
     51 void BinarySearchTree::Init()
     52 {
     53 }
     54 
     55 void BinarySearchTree::Delete( int aValue )
     56 {
     57     Node* lpNode = Search(aValue);
     58     if (NULL == lpNode)
     59     {
     60         return;
     61     }
     62 
     63     Node* lpDeleteNode = NULL;
     64 
     65     if (!lpNode->m_pLeft && !lpNode->m_pRight)
     66     {
     67         if (lpNode->m_pParent->m_pLeft = lpNode)
     68         {
     69             lpNode->m_pParent->m_pLeft = NULL;
     70         }
     71         else
     72         {
     73             lpNode->m_pParent->m_pRight = NULL;
     74         }
     75         delete lpNode;
     76     }
     77     else
     78     {
     79         if (!lpNode->m_pLeft && lpNode->m_pRight)
     80         {
     81             if (lpNode->m_pParent->m_pLeft == lpNode)
     82             {
     83                 lpNode->m_pParent->m_pLeft = lpNode->m_pRight;
     84                 lpNode->m_pRight->m_pParent = lpNode->m_pParent;
     85             }
     86             else
     87             {
     88                 lpNode->m_pParent->m_pRight = lpNode->m_pRight;
     89                 lpNode->m_pRight->m_pParent = lpNode->m_pParent;
     90             }
     91             delete lpNode;
     92             lpNode =NULL;
     93         }
     94         else if (lpNode->m_pLeft && !lpNode->m_pRight)
     95         {
     96             if (lpNode->m_pParent->m_pLeft == lpNode)
     97             {
     98                 lpNode->m_pParent->m_pLeft = lpNode->m_pLeft;
     99                 lpNode->m_pLeft->m_pParent = lpNode->m_pParent;
    100             }
    101             else
    102             {
    103                 lpNode->m_pParent->m_pRight = lpNode->m_pLeft;
    104                 lpNode->m_pLeft->m_pParent = lpNode->m_pParent;
    105             }
    106             delete lpNode;
    107             lpNode = NULL;
    108         }
    109         else
    110         {
    111             Node* lpSuccessorNode = Successor(lpNode);
    112             lpNode->m_Value = lpSuccessorNode->m_Value;
    113             if (lpSuccessorNode->m_pRight)
    114             {
    115                 lpSuccessorNode->m_pParent->m_pLeft = lpSuccessorNode->m_pRight;
    116                 lpSuccessorNode->m_pRight->m_pParent = lpSuccessorNode->m_pParent;
    117             }
    118             delete lpSuccessorNode;
    119             lpSuccessorNode = NULL;
    120         }
    121     }
    122 }
    123 
    124 void BinarySearchTree::PreOrderPrint()
    125 {
    126     std::queue<Node*> lStack;
    127     Node* lpCurNode = m_pRootNode;
    128     
    129     if (NULL != lpCurNode)
    130     {
    131         lStack.push(lpCurNode);
    132         while(!lStack.empty())
    133         {
    134             Node* lpNode = lStack.front();
    135             lStack.pop();
    136             PrintNode(lpNode);
    137             if (lpNode->m_pLeft)
    138             {
    139                 lStack.push(lpNode->m_pLeft);
    140             }
    141             if (lpNode->m_pRight)
    142             {
    143                 lStack.push(lpNode->m_pRight);
    144             }
    145         }
    146     }
    147 }
    148 
    149 void BinarySearchTree::AfterOrderPrint()
    150 {
    151     std::stack<Node*> lStack;
    152     Node* lpCurNode = m_pRootNode;
    153     bool lDone = true;
    154     while(!lStack.empty() || lpCurNode)
    155     {
    156         if (lpCurNode)
    157         {
    158             lStack.push(lpCurNode);
    159             lpCurNode = lpCurNode->m_pRight;
    160         }
    161         else
    162         {
    163             lpCurNode = lStack.top();
    164             lStack.pop();
    165             PrintNode(lpCurNode);
    166             lpCurNode = lpCurNode->m_pLeft;
    167         }
    168     }
    169 }
    170 
    171 void BinarySearchTree::MidOrderPrint()
    172 {
    173     Node* lpNode = m_pRootNode;
    174     std::stack<Node*> lQueue;
    175 
    176     while(NULL != lpNode || !lQueue.empty())
    177     {
    178         if (NULL != lpNode)
    179         {
    180             lQueue.push(lpNode);
    181             lpNode = lpNode->m_pLeft;
    182         }
    183         else
    184         {
    185             lpNode = lQueue.top();
    186             lQueue.pop();
    187             PrintNode(lpNode);
    188             lpNode = lpNode->m_pRight;
    189         }
    190     }
    191 }
    192 
    193 Node* BinarySearchTree::MinNode(Node* apNode)
    194 {
    195     Node* lpPreNode = NULL;
    196     Node* lpNode = apNode;
    197 
    198     while(lpNode)
    199     {
    200         lpPreNode = lpPreNode;
    201         lpNode = lpNode->m_pLeft;
    202     }
    203 
    204     return lpPreNode;
    205 }
    206 
    207 Node* BinarySearchTree::MaxNode(Node* apNode)
    208 {
    209     Node* lpPreNode = NULL;
    210     Node* lpNode = apNode;
    211 
    212     while(lpNode)
    213     {
    214         lpPreNode = lpPreNode;
    215         lpNode = lpNode->m_pRight;
    216     }
    217 
    218     return lpPreNode;
    219 }
    220 
    221 Node* BinarySearchTree::Successor(Node* aNode)
    222 {
    223     if (NULL == m_pRootNode)
    224     {
    225         return NULL;
    226     }
    227 
    228     Node* lpNode = aNode;
    229     if (lpNode->m_pRight)
    230     {
    231         return MinNode(lpNode->m_pRight);
    232     }
    233     else
    234     {
    235         while(lpNode && lpNode->m_pParent->m_pRight == lpNode)
    236         {
    237             lpNode = lpNode->m_pParent;
    238         }
    239 
    240         return lpNode;
    241     }
    242 }
    243 
    244 Node* BinarySearchTree::Search( int aValue )
    245 {
    246     Node* lpNode = m_pRootNode;
    247     while(lpNode)
    248     {
    249         if (lpNode->m_Value > aValue)
    250         {
    251             lpNode = lpNode->m_pLeft;
    252         }
    253         else if (lpNode->m_Value < aValue)
    254         {
    255             lpNode = lpNode->m_pRight;
    256         }
    257         else
    258         {
    259             return lpNode;
    260         }
    261     }
    262     return NULL;
    263 }
    View Code
  • 相关阅读:
    AVCODEC_MAX_AUDIO_FRAME_SIZE 未定义标识符
    ffmpeg -使用总结
    ubuntu 编译安装ffmpeg
    转-查看Linux CPU个数,核心,线程数
    fpga是什么
    div自适应水平垂直居中的方法
    css百分比问题——`top`、`left`、'translate'的百分比参照谁?
    经典面试题:二分查找/折半查找
    JavaScript预解析
    React--组件
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/3289008.html
Copyright © 2011-2022 走看看