二叉樹搜尋遍歷

2021-10-23 05:43:19 字數 4243 閱讀 4391

#include

#include

#define max_size 128

typedef struct _bnode _btree, _bnode;

//api介面

bool insertbtree(_btree **root, _bnode *node); //插入樹

bool deletebtree(_btree **root, int key); //刪除樹

bool querybyloop(const _btree *root, int key); //查詢樹節點是否有key值

void preorderrec(const _btree *root); //前序遍歷輸出樹

void preorder(_btree *root); //通過棧實現前序遍歷

typedef struct _sqstack _sqstack;

//api介面

bool initstack(_sqstack &stack); //棧初始化

bool pushstack(_sqstack &stack, const _bnode e); //入棧

bool popstack(_sqstack &stack, _bnode &e); //出棧

bool isempty(const _sqstack &stack); //棧空

bool isfull(const _sqstack &stack); //棧滿

void destorystack(_sqstack &stack); //釋放空間

bool insertbtree(_btree **root, _bnode *node)

node->lchild = node->rchild = null;

if (*root == null)

_bnode *parent = null, *tmp = null;

//遍歷節點先指向首節點

tmp = *root;

int key = node->data;

//標誌位

bool quit = false;

while (tmp != null)

else

}//根據標誌位判斷

if (quit)

else

return true;

//刪除的數,找到最大數

static int delete_findmax(_bnode *tmp)

while (q->rchild != null)

max = q->data;

parent->rchild = null;

delete q;

return max;//需要用二級指標, 帶出去root的指向首位址

bool deletebtree(_btree **root, int key)

_bnode *tmp = *root;

_bnode *parent = tmp;

//標誌位

bool quit = false;

while (tmp != null && tmp->data != key)

else

}if (tmp == null)

//如果刪除節點為首位址,while迴圈不會執行一次

//tmp就為root首節點

//刪除首節點,如果首節點

指向首節點 ,刪除的tmp 首節點沒有左右子節點

if (tmp == *root && tmp->lchild == null && tmp->rchild == null)

指向首節點 ,刪除的tmp 首節點有左子節點,沒有右子節點

else if (tmp == *root && tmp->lchild != null && tmp->rchild == null)

指向首節點, 刪除的tmp 首節點有右子節點, 沒有左子節點

else if (tmp == *root && tmp->rchild != null && tmp->lchild == null)

//如果不等於null,證明tmp就是刪除的節點,parent就是刪除的上乙個節點根據quit判斷標誌位

//4種情況

//1.刪除的tmp節點沒有左右子節點,tmp為葉子節點

if (tmp->lchild == null && tmp->rchild == null)

//2.刪除的tmp節點有左子節點,沒有右子節點

else if (tmp->lchild != null && tmp->rchild == null)

//3.刪除的tmp節點有右子節點,沒有左子節點

else if (tmp->rchild != null && tmp->lchild == null)

//4.刪除的tmp節點有左右子節點

else if (tmp->lchild != null && tmp->rchild != null)

return true;

//查詢樹節點是否有key值

bool querybyloop(const _btree *root, int key)

const _bnode *p = root;

while (p != null && p->data != key)

else

}if (p == null || p->data != key)

return true;

//輸出樹(static)

static void spreorderrec(const _btree *root)

printf("- %d ", root->data);

spreorderrec(root->lchild);

spreorderrec(root->rchild);

void preorderrec(const _btree *root)

//通過棧實現前序遍歷

void preorder(_btree *root)

_bnode cur;					//遍歷值

_sqstack stack;

//初始化棧

initstack(stack);

//入棧

pushstack(stack, *root);

//不空返回false

printf("\n前序遍歷..........\n");

while (!isempty(stack))

if (cur.lchild != null)

}//釋放空間

destorystack(stack);

printf("\n\n");

//初始化

bool initstack(_sqstack &stack)

stack.top = stack.base;

return true;

//判斷是否空

bool isempty(const _sqstack &stack)

else

}//判斷是否滿

bool isfull(const _sqstack &stack)

else

}//入棧

bool pushstack(_sqstack &stack, const _bnode e)

*(stack.top++) = e;

return true;

//出棧

bool popstack(_sqstack &stack, _bnode &e)

e = *(--stack.top);

return true;

//釋放空間

void destorystack(_sqstack &stack)

delete stack.base;

stack.base = stack.top = null;

int main(void) ;

int size = sizeof test / sizeof test[0];

int i = -1;

while (++i < size)

else

}//前序遍歷

preorder(root);

system("pause");

return 0;

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...