求树的深度用递归算法来求解很容易,但递归深度有可能会特别深,导致空间不够,本题需要用非递归解才可以,这里使用一个队列来实现,代码如下:
#include <queue>
#include <iostream>
using namespace std;
struct Node
{
Node * pLeft;
Node * pRight;
int value;
Node(int v) : value(v), pLeft(NULL), pRight(NULL){}
};
int calculateTreeHeight(Node *root)
{
if(root == NULL)
return 0;
int height = 0;
int visitNumber = 0;
int enqueueNumber = 1;
int lastNumber = 1;
queue<Node *> q;
q.push(root);
while(!q.empty())
{
Node * node = q.front();
q.pop();
visitNumber ++;
if(node->pLeft != NULL)
{
q.push(node->pLeft);
enqueueNumber++;
}
if(node->pRight != NULL)
{
q.push(node->pRight);
enqueueNumber++;
}
//到层的最后一个节点了
if(visitNumber == lastNumber)
{
height ++;
lastNumber = enqueueNumber;
}
}
return height;
}
int main()
{
Node* root = new Node(1);
Node* tmp = new Node(2);
root->pLeft = tmp;
tmp = new Node(3);
root->pRight = tmp;
tmp = new Node(4);
root->pLeft->pLeft = tmp;
tmp = new Node(5);
root->pLeft->pRight = tmp;
tmp = new Node(6);
root->pRight->pRight = tmp;
tmp = new Node(7);
root->pLeft->pRight->pLeft = tmp;
tmp = new Node(8);
root->pLeft->pRight->pRight = tmp;
cout << calculateTreeHeight(root) << endl;
system("pause");
}