一.問題分析
1.以下分析以插入右孩子為例,插入左孩子的方法類似,只需將插入右孩子的方法中方向換掉即可。
2.假設被插入節點為s,插入的節點為r。在該節點處插入乙個右孩子分為兩種情況,即s有右子樹和s沒有右子樹。 1)
s沒有右子樹時,情況比較簡單。顯然,只需將①r的rchild執行s的rchild,②s的rchild指向r,③r的lchild指向s,
注意以上三步操作的順序不可顛倒。此種情況類似於鍊錶的操作。
2) s有右子樹時,還需要對s的右子樹的指標域進行操作。關鍵的一步為:令原來s的中根順序後繼節點s$的lchild指向r.
其實s$就是s原來右子樹的最左節點。s$在插入前lchild是指向s的。
以上大家最好畫圖理解。
二.關鍵函式
有了上面的分析,相信大家能寫出函式了。
以下**中出現的innext(node* n) 和inpre(node* n) 函式為中序遍歷的後繼結點和前驅結點函式
//插入右孩子
void rinsert(node* s,node* r)
}
//插入左孩子
void linsert(node* s,node* l)
}
三.完整**
以下給出了二叉樹操作的完整**,包括了測試用例。
/*題目:
在中序線索二叉樹中插入乙個結點q作為樹中某個結點p的左孩子,試給出相應的演算法。
要求:1、 定義中序線索二叉樹的型thtree以及基本操作。
2、 定義函式void linsert(thtree p, thtree q); 實現題目要求的操作。
在主函式中,利用操作rinsert和linsert構造乙個線索二叉樹,
並中序輸出二叉樹的結點的元素,驗證結果。
kaiser njtech
*/#include#include#include#include#includeusing namespace std;
typedef int elementtype;
struct node;
typedef node* head;//指向樹根root
typedef node* tree;//指向線索樹的根節點
void makenull(head& h)//將線索二叉樹置空
head pointtotree(head& h,tree& t)//令head指向tree,注意head指向的並不是根節點,tree指向根節點
//中根遍歷的下乙個節點
node* innext(node* p)
//中根遍歷的上乙個節點
node* inpre(node* p)
//中序遍歷
void thinorder(head h)
while(temp!=h);
} //插入右孩子
void rinsert(node* s,node* r)
}//插入左孩子
void linsert(node* s,node* l)
} int main()
{ head h=new node;
node* root=new node;
node* lc=new node;
node* rc=new node;
node* c=new node;
root->element=1;
lc->element=2;
rc->element=3;
c->element=4;
h->rchild=root;
h->lchild=h;
h->ltag=true;
h->rtag=true;
root->lchild=h;
root->rchild=h;
root->ltag=false;
root->rtag=false;
//構造線索樹213
linsert(root,lc);
rinsert(root,rc);
thinorder(h);
cout<
C 二叉樹左右孩子的交換
二叉樹每個結點實現左右孩子 如果存在 的交換,這個思想大概就是判斷一下樹的每個結點是否存在左 右結點,若存在,則直接交換位置 核心 如下 通過遞迴遍歷或者其他的遍歷,在遍歷的同時,進行對結點判斷,是否存在左孩子和右孩子,若存在 至少乙個 則進行交換 void exchange binode t 完全...
滿k叉樹的孩子節點的編號問題推導
先複習乙個等比數列的公式 此題的答案是 k x 1 1 i 我的解法 解這一道題的關鍵是充滿想象力,k叉樹是自相似的。也就是說 你只需要把每一層乘以k 也就是 放大 k倍 就得到也是乙個k叉樹,只不過沒有根,而且是每層都是原k叉樹向下平移了一層。每一層的下面一層,相當於把每一層放大k倍,也就是平移到...
左孩子右兄弟表示法的任意有根樹的遍歷
演算法導論 p.248 10.4 4題目描述 對於乙個含n個結點的任意有根樹,寫出乙個o n 時間的過程,輸出其所有關鍵字,該樹以左孩子右兄弟表示法儲存。與二叉樹的遍歷類似 class tree def init self,val self.val val self.left child none ...