data<<" ";
}
if (topNode->leftChild != NULL && !topNode->leftVisited)
{
stack.push_back(topNode->leftChild);
topNode->leftVisited = true;
}
else if (topNode->rightChild != NULL && !topNode->rightVisited)
{
stack.push_back(topNode->rightChild);
topNode->rightVisited = true;
}
else
{
// 针对叶子节点或者单边子节点的情况
if (topNode->leftChild == NULL || topNode->rightChild == NULL)
{
cout<data<<" ";
}
stack.pop_back();
}
}
}
//******************************************************************************
// Name: __AfterVisite
// Desc: 非递归后根遍历思路二
//******************************************************************************
void __AfterVisite(Node* tree)
{
typedef vector StackNode;
StackNode stack;
Node *curNode; // 当前结点
Node *preNode = NULL; // 前一次访问的结点
stack.push_back(tree);
while(!stack.empty())
{
curNode = stack.back();
if((curNode->leftChild == NULL && curNode->rightChild == NULL) ||
(preNode != NULL && (preNode == curNode->leftChild || preNode == curNode->rightChild)))
{
cout<data<<" "; // 如果当前结点没有孩子结点或者孩子节点都已被访问过
stack.pop_back();
preNode = curNode;
}
else
{
if(curNode->rightChild != NULL)
{
stack.push_back(curNode->rightChild);
}
if(curNode->leftChild != NULL)
{
stack.push_back(curNode->leftChild);
}
}
}
}
//******************************************************************************
// Name: LevelVisite
// Desc: 层次遍历
//******************************************************************************
void LevelVisite(Node* tree)
{
typedef list QueueNode;
QueueNode queue;
queue.push_back(tree);
while (queue.size() > 0) //由上至下,由左至右
{
Node* curNode = queue.front();
queue.pop_front();
cout<data<<" ";
if (curNode->leftChild != NULL)
{
queue.push_back(curNode->leftChild);
}
if (curNode->rightChild != NULL)
{
queue.push_back(curNode->rightChild);
}
}
}
//******************************************************************************
// Name: CaculateLeafNum
// Desc: 统计叶子节点的数量
//******************************************************************************
int CaculateLeafNum(Node* tree)
{
if (tree == NULL)
{
return 0;
}
if (tree->leftChild == NULL && tree->rightChild == NULL) //孤立点
{
return 1;
}
//递归计算
int sum = 0;
sum += CaculateLeafNum(tree->leftChild);
sum += CaculateLeafNum(tree->rightChild);
return sum;
}
//******************************************************************************
// Name: CaculateAllNodeNum
// Desc: 统计所有节点数量
//******************************************************************************
int CaculateAllNodeNum(Node* tree)
{
/*static int sum = 0;
if(tree != NULL)
{
sum += 1;
CaculateAllNodeNum(tree->leftChild);
CaculateAllNodeNum(tree->rightChild);
}*/
int sum = 0;
if (tree != NULL)
{
sum = 1;
sum += CaculateAllNodeNum(tree->leftChild);
sum += CaculateAllNodeNum(tree->rightChild);
}
return sum;
}
//******************************************************************************
// Name: CaculateDepth
// Desc: 计算二叉树的深度
//******************************************************************************
int CaculateDepth(Node* tree)
{
int leftDepth = 0;
int ri