線索樹任意節點插入左右孩子

2021-07-11 02:26:23 字數 2147 閱讀 9200

一.問題分析

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 ...