#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 解釋 輸入為 ...