二叉鍊錶儲存結構的型別定義如下:
typedef struct node
*bitree,bitnode;
二叉樹的基本運算:
(1)二叉樹的初始化操作。
二叉樹的初始化需要將指向二叉樹的根結點指標置為空。
void initbittree(bitree *t)
(2)二叉樹的銷毀操作。
void destroybittree(bitree *t)
if ((*t)->rchild)
free(*t);
*t=null;
}}
(3)建立二叉樹操作。
根據二叉樹的遞迴定義,先生成二叉樹的根結點,將元素值賦值給結點的資料域,然後遞迴建立左子樹和右子樹。
void createbittree(bitree *t)
else
(*t)->data=ch;
createbittree(&((*t)->lchild)); //構造左子樹
createbittree(&((*t)->rchild)); //構造右子樹
}}
(4)二叉樹的左插入操作。
指標p指向二叉樹t的某個結點,將子樹c插入到t中,使c成為p指向結點的左子樹,p指向結點的原來左子樹成為右子樹。
int insertleftchild(bitree p,bitree c)
return 0;
}
(5)二叉樹的右插入操作。
指標p指向二叉樹t的某個結點,將子樹c插入到t中,使c成為p指向結點的右子樹,p指向結點的原來右子樹成為右子樹。
int insertrightchild(bitree p,bitree c)
return 0;
}
(6)返回二叉樹結點的指標操作。
在二叉樹中查詢指向元素值為e的結點,如果找到該結點,則返回該結點的指標,否則,返回null。
bitree point(bitree t,datatype e)
if (p->lchild) //如果左孩子結點存在,將左孩子結點入隊
if (p->rchild) //如果右孩子結點存在,將右孩子結點入隊
}} return null;
}
(7)返回二叉樹結點的左孩子元素值操作。
如果元素值為e的結點存在,並且該結點的左孩子結點存在,則將該結點的左孩子結點的元素值返回。
datatype leftchild(bitree t,datatype e)
} return;
}
(8)返回二叉樹結點的右孩子元素值操作。
如果元素值為e的結點存在,並且該結點的右孩子結點存在,則將該結點的右孩子結點的元素值返回。
datatype rightchild(bitree t,datatype e)
} return;
}
(9)二叉樹的左刪除操作。
在二叉樹中,指標p指向二叉樹的某個結點,將p所指向的結點的左子樹刪除。
int deleteleftchild(bitree p)
return 0;
}
(10)二叉樹的右刪除操作。
在二叉樹中,指標p指向二叉樹的某個結點,將p所指向的結點的右子樹刪除。
int deleterightchild(bitree p)
return 0;
}
二叉樹鏈式儲存的C實現
在實現二叉樹的鏈式儲存的過程中,我遇到了一些問題,感到對遞迴的理解還不夠深入。另外,中有一處必須使用全域性變數做陣列索引,還在研究其中的原因,已完成,現在貼在部落格中供參考 include include include include define maxsize 100 define ok 1 ...
C 實現鏈式儲存線索二叉樹
一顆線索二叉樹 根據下圖進行節點的建立 如下 因為普通二叉樹有空指標域,所以我們可以利用這些空指標來線索化 1 二叉樹的線索化,實質上就是遍歷一棵二叉樹,在遍歷過程中,訪問節點的操作是檢查當前結點的左右指標域是否為空,如果為空,即將他們改為前驅節點或後繼節點的線索。為記錄前驅節點,定義pre為全域性...
二叉樹的鏈式儲存
實現二叉樹的基本操作 建立 遍歷 計算深度 結點數 葉子數等。輸入c,先序建立二叉樹,表示空節點 輸入h 計算二叉樹的高度 輸入l 計算二叉樹的葉子個數 輸入n 計算二叉樹節點總個數 輸入1 先序遍歷二叉樹 輸入2 中序遍歷二叉樹 輸入3 後續遍歷二叉樹 輸入f 查詢值 x的節點的個數 輸入p 以縮...