二叉樹基礎操作總結

2021-08-25 08:31:17 字數 3756 閱讀 3436

1.定義資料結構

//二叉樹

typedef

char btdatatype;

typedef

struct binarytreenode

btnode;

2.各個函式介面宣告
//建立乙個二叉樹結點

btnode* buybtnode(btdatatype x);

//建立一顆二叉樹

btnode* binarytreecreate(btdatatype* a, int n, int *pi);

//銷毀二叉樹

void binarytreedestroy(btnode** newnode);

//二叉樹結點個數(遞迴版本)

int binarytreesize(btnode* root);

//二叉樹結點個數(設定全域性變數,遍歷一遍二叉樹累加)

void binarytreesize_c(btnode* root);

//葉子節點個數

int binarytreeleafszie(btnode* root);

//葉子結點個數(設定全域性變數,遍歷一遍二叉樹符合條件則累加)

void binarytreeleafszie_c(btnode* root);

//先序遍歷(遞迴版本)

void binarytreeprevorder_r(btnode* root);

//中序遍歷(遞迴版本)

void binarytreemidorder_r(btnode* root);

//後序遍歷(遞迴版本)

void binarytreepostorder_r(btnode* root);

//二叉樹的高度

int binarytreehigh(btnode* root);

//返回結點的雙親結點

btnode* binarytreefindparent(btnode* root, btdatatype x);

//第k層結點的個數

int binarytreelevelksize(btnode* root, int k);

3.函式實現
//建立乙個二叉樹結點

btnode* buybtnode(btdatatype x)

return newnode;

}//給乙個前序序列,建立乙個二叉樹

btnode* binarytreecreate(btdatatype* a, int n, int *pi)

else

}//銷毀二叉樹(要用後序遍歷銷毀,如果用前序或者中序把根節點銷毀了就會找不到其他結點)

void binarytreedestroy(btnode** newnode)

binarytreedestroy(&root->_left);

binarytreedestroy(&root->_right);

free(root);

root = null;

}//結點個數

int binarytreesize(btnode* root)

//否則返回1加左子樹的結點在加上右字數的結點

return binarytreesize(root->_left) + binarytreesize(root->_right) + 1;

}//定義乙個全域性變數,遍歷累加

int size = 0;

void binarytreesize_c(btnode* root)

size++;

binarytreesize_c(root->_left);

binarytreesize_c(root->_right);

}//葉子結點的個數

int binarytreeleafszie(btnode* root)

if ((root->_left == null) && (root->_right == null))

return binarytreeleafszie(root->_left) + binarytreeleafszie(root->_right);

}//定義全域性變數,遍歷符合條件的則累加

void binarytreeleafszie_c(btnode* root)

if ((root->_left == null) && (root->_right == null))

binarytreeleafszie_c(root->_left);

binarytreeleafszie_c(root->_right);

}//前序遍歷

void binarytreeprevorder_r(btnode* root)

//訪問根

printf("%c", root->_data);

//遞迴訪問左子樹

binarytreeprevorder_r(root->_left);

//遞迴訪問右子樹

binarytreeprevorder_r(root->_right);

}//中序遍歷

void binarytreemidorder_r(btnode* root)

//遞迴訪問左子樹

binarytreemidorder_r(root->_left);

//訪問根

printf("%c", root->_data);

//遞迴訪問右子樹

binarytreemidorder_r(root->_right);

}//後序遍歷

void binarytreepostorder_r(btnode* root)

//遞迴訪問左子樹

binarytreepostorder_r(root->_left);

//遞迴訪問右子樹

binarytreepostorder_r(root->_right);

//訪問根

printf("%c", root->_data);

}//二叉樹的高度(比較左右子樹那個高,高的加1既為二叉樹的高度)

int binarytreehigh(btnode* root)

int ret1 = binarytreehigh(root->_left);

int ret2 = binarytreehigh(root->_right);

return ret1 > ret2 ? ret1 + 1 : ret2 + 1;

}//返回結點的雙親結點

btnode* binarytreefindparent(btnode* root, btdatatype x)

if (root->_left)

}if (root->_right)

}btnode* ret = binarytreefindparent(root->_left, x);

if (ret)

return ret;

ret = binarytreefindparent(root->_right, x);

if (ret)

return ret;

return

null;

}//第k層有多少結點(左子樹的k-1層加上右子樹的k-1層)

int binarytreelevelksize(btnode* root, int k)

if (k == 1)

return binarytreelevelksize(root->_left, k - 1) + binarytreelevelksize(root->_right, k - 1);

}

二叉樹操作總結

對於二叉樹,有前序 中序 後序三種遍歷方法,由於樹的定義本身就是遞迴定義的,故採用遞迴方法實現三種遍歷簡潔易懂。若採用非遞迴訪問,則需要使用棧來模擬遞迴的實現。三種遍歷的非遞迴演算法中,前序和後序較容易,而後序相對較難。前序遍歷 遞迴非遞迴 樹的遍歷 中序遍歷 遞迴非遞迴 後序遍歷 遞迴非遞迴 層次...

二叉樹 基礎操作

核心思想 遞迴處理 前序 根左右 中序 左根右 後序 左右根 class node public class testtree system.out.print root.val preorder root.left preorder root.right 中序 public static void...

二叉樹 二叉樹的基礎特性大總結

本文介紹的是最基礎的二叉樹節點和深度的有關規律,並不涉及嚴密的數學推理和證明 在計算它的深度和節點數時,一定要畫個圖來輔助理解 對於新手來說,完全可以使用不完全歸納法直接得出節點數規律,深度的規律 基本特點 每個節點最多有兩顆子樹 左子樹和右子樹時有順序的,次序不能顛倒 即使某節點只有一顆子樹,也要...