樹——二叉樹結點的插入


1,需要考慮的問題:

       1,是否能夠在二叉樹任意結點處插入子結點?

              1,不能,二叉樹每個結點的成員是相對固定的,只有兩個指向左右后繼結點的指針成員;

       2,是否需要指定新數據元素(新結點)的插入位置?

              1,需要;

              2,插入新結點(或數據元素)作為葉結點孩子,具體插入左邊還是右邊呢?

             

2,二叉樹結點的位置枚舉類型:

       1,enum BTNodePos

            {

               ANY,  // 不介意,左右孩子都可以

               LEFT,  // 插入新結點只能作為左孩子;

               RIGHT  // 插入新結點只能作為右孩子;

            };

 

3,插入方式:

       1,插入新結點:

              1,bool insert(TreeNode<T>* node);

                     1,只要新結點能插入就可以,不管左邊還是右邊的位置;

                     2,左右沒有位置,返回 false;

              2,bool insert(TreeNode<T>* node, BTNodePos pos);

                     1,按照 pos 要求插入位置,要求位置沒有位置,則返回 false;

                     2,通用樹結構插入操作只會返回 true;

       2,插入數據元素:

              1,bool insert(const T& value, TreeNode<T>* parent);

                     1,只要有位置就插入;

              2,bool insert(const T& value, TreeNode<T>* parent, BTNodePos pos);

                     1,按 pos 要求插入;

                    

4,新結點的插入:

 

       1,查找;

       2,插入;

             

5,指定位置的結點插入:

     

      

6,插入新結點:

 

7,插入數據元素:

 

 

8,二叉樹的插入成員函數實現:

  1,基於結點的插入

 1    bool insert(TreeNode<T>* node)
 2     {
 3          return insert(node, ANY);  //將 node 作為目標結點插入,插入位置沒有要求
 4    }
 5 
 6     virtual bool insert(TreeNode<T>* node, BTNodePos pos)
 7     {
 8         bool ret = true;
 9 
10         if( node != NULL )  // 要插入的結點非空
11         {
12             if( this->m_root == NULL )  // 要插入的對象樹是空樹
13             {
14                 node->parent = NULL;
15                 this->m_root = node;
16             }
17             else  // 非空樹
18             {
19                 BTreeNode<T>* np = find(node->parent);  // 目標父結點在當前樹中
20                 if( np != NULL )  // 在參數中
21                 {
22                     insert(dynamic_cast<BTreeNode<T>*>(node), np, pos);
23                 }
24                 else
25                 {
26                     THROW_EXCEPTION(InvalidParameterException, "Invalid parent tree node ...");
27                 }
28             }
29         }
30         else
31         {
32             THROW_EXCEPTION(InvalidParameterException, "Parameter node can not be NULL");
33         }
34         return ret;
35   }
   2,基於數據值的插入:
 1    bool insert(const T& value, TreeNode<T>* parent)
 2     {
 3         return insert(value, parent, ANY);  // 位置沒有要求
 4    }
 5     virtual bool insert(const T& value, TreeNode<T>* parent, BTNodePos pos)
 6     {
 7         bool ret = true;
 8 
 9         BTreeNode<T>* node = BTreeNode<T>::NewNode();
10 
11         if( node == NULL )  // 申請未成功
12         {
13             THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new node ...");
14         }
15         else
16         {
17             node->value = value;  // 插入之前設置成員的值
18             node->parent = parent;  // 目標父結點設置好
19 
20             ret = insert(node, pos);
21 
22             if( !ret )  // 若果插入不成功;就釋放這個結點;
23             {
24                 delete node;
25             }
26         }
27         return ret;
28    }

 

9,小結:

       1,二叉樹的插入操作需要指明插入的位置;

              1,定義枚舉常量;

       2,插入操作必須正確處理指向父結點的指針;

       3,插入數據元素時需要從堆空間中創建結點;

       4,當數據元素插入失敗時需要釋放結點空間;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM