每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。
滿二叉樹:所有終端都在同一層次,且非終端結點的度數為2。
在滿二叉樹中若其深度為h,則其所包含的結點數必為2^h-1。
完全二叉樹:除了最大的層次即成為一顆滿二叉樹且層次最大那層所有的結點均向左靠齊,即集中在左面的位置上,不能有空位置。
對於完全二叉樹,設乙個結點為i則其父節點為i/2,2i為左子節點,2i+1為右子節點。
順序儲存:
#define length 100
typedef char datatype;
typedef struct nodenode;
node tree[length];
int length;
int root;
鏈式儲存
typedef char datatype;
typedef struct binnodebinnode;
typedef binnode* bintree; //bintree本身是個指向結點的指標
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
前序遍歷:abdefgc
中序遍歷:debgfac
後序遍歷:edgfbca
#include #include #include #include using namespace std;
struct node;};
void creatbitree(node * &root)
root = new node(x);
creatbitree(root->left);
creatbitree(root->right);
}void visit(node *t)
/***********************************遞迴方式遍歷***********************************/
//先序遞迴遍歷
void preorder(node * root)
}//中序遞迴遍歷
void inorder(node * root)
}//後序遞迴遍歷
void postorder(node * root)
}/***********************************非遞迴方式遍歷***********************************/
//先序遍歷
void preorderf(node * root)
}//中序遍歷
void inorderf(node * root)
else
} }//後序遍歷
void postorderf(node * root)
for (int i = 0; i < rs.size(); i++)
cout << rs[i] << " ";
}int _tmain(int argc, _tchar* ar**)
因元素需要儲存有先進先出的特性,所以選用佇列儲存
佇列的定義.
#define max 1000
typedef struct seqqueueseqqueue;
void enter(seqqueue *q,bintree t)else}
bintree del(seqqueue *q)else
}
遍歷實現
void level_tree(bintree t)
enter(&q,t);
while(q.front != q.rear)
if(t->rchild)
}}
利用前序遍歷的結果生成二叉樹
//遞迴呼叫,不存點,想的時候只關注於乙個點,因為還會回來的,不要跟蹤程式執行,否則容易多加迴圈
void createtree(bintree *t)
}
二叉樹的查詢
bintree search_tree(bintree t,datatype x)
if(t->data == x)else
return t;
}}
統計節點個數
int count_tree(bintree t)
return 0;
}
比較兩個樹是否相同
int is_equal(bintree t1,bintree t2)
if(t1 && t2 && t1->data == t2->data)
}return 0;
}
求二叉樹的深度
int hight_tree(bintree t)
left = hight_tree(t->lchild);
right = hight_tree(t->rchild);
h = (left>right?left:right)+1;
return h;
}
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
理論基礎 二叉樹 二叉樹的遍歷
以二叉鍊錶的儲存結構為例 若二叉樹為空,則空操作,否則 先訪問根結點,再先序遍歷左子樹,然後先序遍歷右子樹 void preorder node bt 若二叉樹為空,則空操作,否則 先中序遍歷左子樹,再訪問根結點,然後中序遍歷右子樹 void inorder node bt 若二叉樹為空,則空操作,...
二叉樹遍歷
二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...