關於實現二叉樹各個結點的隨機訪問 ( 修改刪除和插入) 問題
演算法分析:
先定義乙個全域性指標型別的陣列*a[100]. 為了實現二叉樹各結點的隨機訪問, 我們可以在按照某種序列( 例如: 先序) 建立的同時, 將生成的結點依次存入定義的指標型別陣列中. 即各個結點的位址也按照某種序列( 先序 ) 順序存入指標型別陣列中.
在這裡以先序建立為例
如圖所示:
2 7
3 4 8 9
5 6
圖中數字為以先序建立二叉樹, 所建立各結點的順序
對於各結點的位址也以此序列存入陣列a中;
由於陣列a可以實現隨機訪問;
此時只需要隨機訪問陣列下標,即可實現各結點的隨機訪問
**實現:
這裡的訪問為輸出結點
#include
#include
struct node *pre,*top[20];
int i=0,j=0;
inta[20]=;
int main()
intk;
voidcreat(struct node **root);
structnode *root,*s,*h;
creat(&root);
printf("結點存放按先序建立並存放\n");
printf("輸入要訪問的第i個結點:");
scanf("%d",&i);
if(i-1>9||i-1<0)
printf("輸入有誤!\n");//共建立了9個結點
else{
s=top[i-1];
printf("%d\n",s->data);
return0;
void creat(struct node **root)//先序建立二叉樹
if(a[i]==0){
*root=null;
i++;
else{
(*root)=(structnode *)malloc(sizeof(struct node ));
top[j]=(*root); //將新建結點存入陣列top中
j++; //陣列下標加1
(*root)->ltag=(*root)->rtag=0;
(*root)->data=a[i];//給結點賦值
i++;
creat(&(*root)->lchild);
creat(&(*root)->rchild);
理解 實現二叉樹的前驅結點問題
如果該節點存在前驅結點,前驅結點不可能存在右子樹,因為右子樹比前驅結點大,而前驅結點的定義是比該節點小的最大節點,也就是中序遍歷結果中在該節點前面乙個的結點。1 先看該節點是否存在左子樹,如果存在直接找 左子樹 中最大的就是他的前驅結點,這裡你可能有點不太理解,為什麼說他存在左子樹,前驅結點一定在他...
二叉樹結點, 排序
二叉樹結點,排序 1.二叉搜尋樹結點最小距離 給定乙個二叉搜尋樹的根結點 root,返回樹中任意兩節點的差的最小值 對這個序列相鄰相減,取最小值即可。實現時,可以優化掉這個序列。在遍歷時記錄上乙個訪問的節點值,和當前節點相減,記錄下最小值即可 定義樹節點 public class treenode ...
二叉樹刪除結點
二叉樹完成刪除結點的操作.規定 1 如果刪除的節點是葉子節點,則刪除該節點 2 如果刪除的節點是非葉子節點,則刪除該子樹 思路首先先處理 考慮如果樹是空樹root,如果只有乙個root結點,則等價將二叉樹置空 然後進行下面步驟 1.因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除...