周二就寫完了,找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 又稱為二叉查詢樹,它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不為空,則左子樹上所有結點的值均小於它的根節點的值 若它的右子樹不為空,則右子樹上所有結點的值均大於它的根節點的值 它的左 右子樹也分別為二叉排序樹 遞迴 二叉排序樹用中序遍歷之...