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,當數據元素插入失敗時需要釋放結點空間;
