關於二叉樹結點實現隨機訪問問題

2021-06-19 02:07:12 字數 1294 閱讀 2572

關於實現二叉樹各個結點的隨機訪問 ( 修改刪除和插入) 問題

演算法分析:

先定義乙個全域性指標型別的陣列*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.因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除...