一. 二叉树的结点表示
struct BinaryTreeNode{
int value;
BinaryTreeNode *lson;
BinaryTreeNode *rson;
};
二. 二叉树的遍历算法
//前序遍历算法
void PrintPreOrder(BinaryTreeNode *root){
if(root != NULL){
cout<<root->value<<endl;
PrintPreOrder(root->lson);
PrintPreOrder(root->rson);
}
}
//中序遍历算法
void PrintInOrder(BinaryTreeNode *root){
if(root != NULL){
PrintInOrder(root->lson);
cout<<root->value<<endl;
PrintInOrder(root->rson);
}
}
//后序遍历算法
void PrintPostOrder(BinaryTreeNode *root){
if(root != NULL){
PrintPostOrder(root->lson);
PrintPostOrder(root->rson);
cout<<root->value<<endl;
}
}
//层序遍历算法
void PrintStageOrder(BinaryTreeNode *root){
if(root == NULL){
return;
}
queue<BinaryTreeNode*>q;
q.push(root);
while(!q.empty()){
BinaryTreeNode *tmpNode = q.front();
cout<<tmpNode->value<<endl;
q.pop();
if(tmpNode->lson != NULL){
q.push(tmpNode->lson);
}
if(tmpNode->rson != NULL){
q.push(tmpNode->rson);
}
}
}
三. 计算二叉树的结点个数
int GetTreeNodeNumber(BinaryTreeNode *root){
if(root == NULL){
return 0;
}
return 1+GetTreeNodeNumber(root->lson)+GetTreeNodeNumber(root->rson);
}
四. 计算二叉树的高度
int GetTreeHigh(BinaryTreeNode *root){
if(root == NULL){
return 0;
}
int lsonHigh = GetTreeHigh(root->lson);
int rsonHigh = GetTreeHigh(root->rson);
return (lsonHigh+1 < rsonHigh+1 ? rsonHigh+1 : lsonHigh+1);
}
bool IsEqual(BinaryTreeNode *root1, BinaryTreeNode *root2){
if(root1 == NULL && root2 == NULL){
return true;
}
if(root1 != NULL && root2 != NULL //一定要是两个根结点都不为空
&&root1->value == root2->value
&& IsEqual(root1->lson, root2->lson)
&& IsEqual(root1->rson, root2->rson)){
return true;
}
else{
return false;
}
}
六. 交换二叉树的左右结点
void ConvertLsonAndRson(BinaryTreeNode *root){
if(root == NULL){
return;
}
BinaryTreeNode *tmpNode = root->lson;
root->lson = root->rson;
root->rson = tmpNode;
ConvertLsonAndRson(root->lson);
ConvertLsonAndRson(root->rson);
}
七. 求二叉树叶子结点的个数
int GetLeafNodeNumber(BinaryTreeNode *root){
if(root == NULL){
return 0;
}
//到了叶子节点
if(root->lson == NULL && root->rson == NULL){
return 1;
}
else{
return GetLeafNodeNumber(root->lson)
+GetLeafNodeNumber(root->rson);
}
}
八. 给定两个二叉树 A 和 B,判断 B 是否为 A 的子结构
bool IsSubTree(BinaryTreeNode* root1, BinaryTreeNode* root2){
//如果root2为NULL肯定是root1的子结构
if(root2 == NULL){
return true;
}
//如果root2不为NULL但root1为NULL肯定不是
if(root1 == NULL){
return false;
}
//如果两个根结点都不为空但是值不同也不是
if(root1->value != root2->value){
return false;
}
else{
return IsSubTree(root1->lson, root2->lson)
&&IsSubTree(root1->rson, root2->rson);
}
}