题目一:输入一颗二叉树的根节点,求该树的深度。从根节点直到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径长度为树的深度。
二叉树结点定义:
struct BinTreeNode{
int m_value;
BinTreeNode *left;
BinTreeNode *right;
//创建根节点,值为e
BinTreeNode* createRoot(int e);
//将e作为当前结点的左孩子值插入
void insertAsLC(int e);
//将e作为当前结点的右孩子值插入
void insertAsRC(int e);
};
解法(递归):
//题目一,求二叉树的深度
int TreeDepth(BinTreeNode *pRoot){
if(pRoot == NULL)
return 0;
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
return (left > right) ? left + 1 : right + 1;
}
题目二:输入一颗二叉树的节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子节点的深度相差不超过1,那么它就是一棵平衡二叉树。
解题思路:利用二叉树后序遍历的特点 LRV
测试用例:
int main(){
//创建一颗A树
BinTreeNode *A = new BinTreeNode;
A->m_value = 8;
A->insertAsLC(8);
A->insertAsRC(7);
A->left->insertAsLC(9);
A->left->insertAsRC(2);
A->left->right->insertAsLC(4);
A->left->right->insertAsRC(7);
//A树深度
std::cout << TreeDepth(A) << std::endl; //Output: 4
//判断二叉树是否是平衡二叉树
std::cout << IsBalancedTree(A); //Output: 0
return 0;
}
函数实现:
//题目二:判断二叉树是否是平衡二叉树
bool IsBalancedTree(BinTreeNode *pRoot, int *pDepth){ //pDepth: 记录深度
if(pRoot == NULL){
*pDepth = 0;
return true; //如果是0当然平衡...
}
int left, right;
if(IsBalancedTree(pRoot->left, &left) && IsBalancedTree(pRoot->right, &right)){
int diff = left - right;
if(diff <= 1 && diff >= -1){
*pDepth = 1 + (left > right ? left : right);
return true;
}
}
return false;
}
//主函数
bool IsBalancedTree(BinTreeNode *pRoot){
int depth = 0; //记录深度
return IsBalancedTree(pRoot, &depth);
}
其他函数:
//其他函数实现
//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
BinTreeNode *root = new BinTreeNode;
root->m_value = e;
return root;
}
//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
BinTreeNode *Left = new BinTreeNode;
Left->m_value = e;
this->left = Left;
}
//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
BinTreeNode *Right = new BinTreeNode;
Right->m_value = e;
this->right = Right;
}