NOJ 二叉排序樹的插入和刪除 西工大資料結構

2021-08-20 06:13:54 字數 3541 閱讀 3524

周二就寫完了,找bug找了很長時間,今天有空了,發出來。題目如下:

構建二叉排序樹,找後繼線索鍊錶,插入都還可以,基本操作,就是這個刪除比較麻煩,好多種情況,而且他居然每次都是對原二叉樹進行插入刪除,輸出之後還得刪除和插入回去,真的是閒的。

找後繼採用棧的方法就可以了,插入就和查詢差不多,只不過插入是找到上一節點,查詢是找到查詢節點,我把這兩個功能集合成乙個函式了,而且我覺得只有後繼很麻煩,所以把前驅和根都找出來了。

刪除需要按照節點的左右支來分情況討論:

以下是我的實現:

#include #include struct binarytreenode

;struct binarytree

;struct binarytreestack

;void run();

struct binarytreenode *createnewtree(struct binarytreenode *root);

struct binarytreenode *createnewnode();

void pushstack(struct binarytreenode *node);

void popstack();

void gettracklist();

int stackemptyjudge();

struct binarytreenode *getnode(int num);

void putoutsection();

void cutinnode(int num);

void deletnode(int num);

void print();

struct binarytree t;

struct binarytreestack s;

int main()

void run()

struct binarytreenode *createnewtree(struct binarytreenode *root)

struct binarytreenode *createnewnode()

void pushstack(struct binarytreenode *node)

void popstack()

void gettracklist()

case 1 :

case 2 :

else

s.l[s.top]->next = next;

if(next) next->before = s.l[s.top];

popstack();}}

}next = t.root;

while(next->left) next = next->left;

t.head = next;

next->before = null;

next = t.root;

while(next->right) next = next->right;

t.end = next;

next->next = null;

}int stackemptyjudge()

struct binarytreenode *getnode(int num)

else

}}void putoutsection()

printf("\n");

}void cutinnode(int num)

void deletnode(int num)

else t.root = null;

}else

else

}else

else t.root = next;

}else

}else

else t.root = before;

}else}}

}gettracklist();

}void print()

printf("\n");

}

以下是各函式的注釋:

void run()

struct binarytreenode *createnewtree(struct binarytreenode *root)

struct binarytreenode *createnewnode()

//棧操作

void pushstack(struct binarytreenode *node)

void popstack()

void gettracklist()

case 1 :

case 2 :

else//若無右支

s.l[s.top]->next = next;//後繼連線

if(next) next->before = s.l[s.top];前驅連線

popstack();//兩次訪問後出棧}}

}next = t.root;//頭尾賦值

while(next->left) next = next->left;

t.head = next;

next->before = null;

next = t.root;

while(next->right) next = next->right;

t.end = next;

next->next = null;

}

int stackemptyjudge()

struct binarytreenode *getnode(int num)

else}}

void putoutsection()

printf("\n");

}

void cutinnode(int num)

void deletnode(int num)

else t.root = null;//整棵樹只有乙個節點,這樹就空了

}else

else//

}else

else t.root = next;

}else

}els//e只有左

else t.root = before;

}else}}

}gettracklist();//後繼鍊錶更新

}

void print()

printf("\n");

}

我估計是還有bug但是測了好多都還行。。。

二叉排序樹的插入和刪除

遞迴的尋找插入的位置。public static treenode insert int x,treenode t else if x t.val t.left insert x,t.left else if x t.val t.right insert x,t.right 如果x已經在tree中了...

二叉排序樹 插入 刪除 查詢

原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...

二叉排序樹的查詢 插入和刪除

二叉排序樹 binary sort tree 又稱為二叉查詢樹,它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不為空,則左子樹上所有結點的值均小於它的根節點的值 若它的右子樹不為空,則右子樹上所有結點的值均大於它的根節點的值 它的左 右子樹也分別為二叉排序樹 遞迴 二叉排序樹用中序遍歷之...