递归法思路:
树的高度即节点子树的高度+1(节点子树的高度即左子树高度,右子树高度的最大值)
代码如下:
// Height_Recursive 递归法求树的高度
int Height_Recursive(TreeNode* pTree) {
if (pTree == NULL)
{
return 0;
}
// 分别求出左子树,右子树的高度,取最大值+1
int leftHeight = Height_Recursive(pTree->left);
int rightHeight = Height_Recursive(pTree->right);
return (leftHeight > rightHeight ? leftHeight: rightHeight)+1;
}
非递归法思路:
借鉴程序遍历的思想,一层层的遍历,累加层数即可得到树的高度
代码如下:
// Height_No_Recursive 非递归法求树的高度
// 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度
int Height_No_Recursive(TreeNode* pTree) {
if (pTree == NULL)
{
return 0;
}
queue<TreeNode*> que;
que.push(pTree);
int height = 0;
TreeNode* p = NULL;
while(!que.empty())
{
height++;
// 该层的节点个数,压入所有节点的孩子节点
int num = que.size();
for (int i=0;i<num;i++)
{
p = que.front();
que.pop();
if (p->left != NULL)
{
que.push(p->left);
}
if (p->right != NULL)
{
que.push(p->right);
}
}
}
return height;
}
实验结果如下图:
完整代码如下:
#include<iostream>
#include<queue>
using namespace std;
// 树(节点)定义
struct TreeNode
{
int data; // 值
TreeNode* left; // 左节点
TreeNode* right;// 右节点
};
// 按照前序建立二叉树,这里我们建立下面的树
// 8
// 6 10
// 4 7 12
// 11
// 所以输入顺序是:8 6 4 0 0 7 0 0 10 0 12 11 0 0 0
void createTree(TreeNode*& t)
{
cout<<"请输入数据:"<<endl;
int val = 0;
cin>>val;
// 0表结束
if (0 == val)
{
t = NULL;
}
else
{
t = new TreeNode();
t->data = val;
cout<<"开始建立:"<<val<<"的左节点:";
createTree(t->left);
cout<<"开始建立:"<<val<<"右节点:";
createTree(t->right);
}
}
// Height_Recursive 递归法求树的高度
int Height_Recursive(TreeNode* pTree) {
if (pTree == NULL)
{
return 0;
}
// 分别求出左子树,右子树的高度,取最大值+1
int leftHeight = Height_Recursive(pTree->left);
int rightHeight = Height_Recursive(pTree->right);
return (leftHeight > rightHeight ? leftHeight: rightHeight)+1;
}
// Height_No_Recursive 非递归法求树的高度
// 思路:借鉴层序遍历的思想,一层层的遍历,层数即高度
int Height_No_Recursive(TreeNode* pTree) {
if (pTree == NULL)
{
return 0;
}
queue<TreeNode*> que;
que.push(pTree);
int height = 0;
TreeNode* p = NULL;
while(!que.empty())
{
height++;
// 该层的节点个数,压入所有节点的孩子节点
int num = que.size();
for (int i=0;i<num;i++)
{
p = que.front();
que.pop();
if (p->left != NULL)
{
que.push(p->left);
}
if (p->right != NULL)
{
que.push(p->right);
}
}
}
return height;
}
int main()
{
TreeNode* pTree = NULL;
createTree(pTree);
cout<<"\n递归法求树的高度"<<endl;
cout<<Height_Recursive(pTree)<<endl;
cout<<"\n非递归法求树的高度"<<endl;
cout<<Height_No_Recursive(pTree)<<endl;
return 0;
}