设为首页 加入收藏

TOP

二叉树代码(较全) (三)
2014-11-23 21:42:24 来源: 作者: 【 】 浏览:16
Tags:代码 较全
tack.size())
{
Node* topNode = stack.back();
if (topNode->leftVisited && topNode->rightVisited)
{
cout<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

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++一些注意点之操作符重载 下一篇poj2354

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)
·基于Python的数据分 (2025-12-27 07:50:03)
·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)