一. 二叉树的结点表示
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); } }