二叉树的遍历(代码递归和数据递归)
来源:互联网 发布:网络广播电台在线收听 编辑:程序博客网 时间:2024/06/06 14:08
TestTree::TestTree(int val) TestTree::~TestTree() bool TestTree::push_LeftChild(int val) bool TestTree::push_RightChild(int val) }
#include "stdafx.h"
#include "tree.h"
#define MAX_TREENODES 10000
{
pHeadNode = new NODE();
pHeadNode->value = val;
pHeadNode->pLeftNode = NULL;
pHeadNode->pRightNode = NULL;
}
{
printf("/n");
destroyTree(pHeadNode);
pHeadNode = NULL;
}
{
NODE *pNode = new NODE();
pNode->value = val;
pNode->pLeftNode = NULL;
pNode->pRightNode = NULL;
if(pHeadNode != NULL)
{
push_LeftNode(pHeadNode,pNode);
return true;
}
return false;
}
void TestTree::push_LeftNode(NODE *pFNode,NODE *pNode)
{
if (pFNode->pLeftNode == NULL)
{
pFNode->pLeftNode = pNode;
return;
}
if (pFNode->pLeftNode != NULL)
{
push_LeftNode(pFNode->pLeftNode, pNode);
return;
}
if (pFNode->pRightNode != NULL)
{
push_RightNode(pFNode->pRightNode, pNode);
return;
}
}
void TestTree::push_RightNode(NODE *pFNode,NODE *pNode)
{
if (pFNode->pRightNode == NULL)
{
pFNode->pRightNode = pNode;
return;
}
if (pFNode->pRightNode != NULL)
{
push_RightNode(pFNode->pRightNode, pNode);
return;
}
if (pFNode->pLeftNode != NULL)
{
push_LeftNode(pFNode->pLeftNode, pNode);
return;
}
}
{
NODE *pNode = new NODE();
pNode->value = val;
pNode->pLeftNode = NULL;
pNode->pRightNode = NULL;
if (pHeadNode)
{
push_RightNode(pHeadNode, pNode);
return true;
}
return false;
}
void TestTree::visit(NODE *treeNode)
{
printf("%d/t",treeNode->value);
}
void TestTree::walkTree()
{
NODE *pNode = pHeadNode;
NODE * NodeStack[MAX_TREENODES];
NODE ** pNodeStack = NULL;
if (pNode)
{
NodeStack[0] = NULL;
pNodeStack = NodeStack + 1;
for (;;)
{
/*如果遍历的节点有左节点把该节点保存到堆栈中,
然后从左节点开始遍历左子树,重复以上的操作,
直到没有左节点的节点*/
while (pNode->pLeftNode !=NULL)
{
*pNodeStack++ = pNode;
pNode = pNode->pLeftNode;
}
for (;;)
{
//*visit 没有左节点的节点
visit(pNode);
if (pNode->pRightNode != NULL)
{
//如果该节点的有右节点,
//从右节点开始循环遍历左子树
pNode = pNode->pRightNode;
break;
}
//如果没有右节点
//从堆栈里取出该节点的父节点
if ((pNode = *--pNodeStack) == NULL)
{
//如果父节点为空该节点是根节点遍历结束
return;
}
}
}
}
void TestTree::destroyTree(NODE *pNode)
{
if (pNode != NULL)
{
if (pNode->pLeftNode != NULL)
{
destroyTree(pNode->pLeftNode);
}
if (pNode->pRightNode != NULL)
{
destroyTree(pNode->pRightNode);
}
printf("detele %d/t" ,pNode->value);
delete pNode;
pNode = NULL;
}
}
void TestTree::recursiveWalkTree()
{
walkTree(pHeadNode);
}
void TestTree::walkTree(NODE * pNode)
{
if (pNode != NULL)
{
if (pNode->pLeftNode != NULL)
{
walkTree(pNode->pLeftNode);
}
visit(pNode);
if (pNode->pRightNode != NULL)
{
walkTree(pNode->pRightNode);
}
}
}
- 二叉树的遍历(代码递归和数据递归)
- 二叉树的遍历(递归和非递归)
- 二叉树的遍历(递归和非递归)
- 二叉树的建立和遍历(递归、非递归)
- 二叉树的遍历(非递归和递归实现)
- 二叉树的先序中序后序遍历 (递归和非递归)
- 二叉树的遍历算法(递归和非递归)
- 二叉树的递归和非递归遍历(java)
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- java 二叉树的递归遍历和非递归遍历
- 二叉树遍历非递归的代码
- 二叉树遍历的应用(递归!递归!递归!)
- 二叉树遍历(先中后序 递归和非递归+层次遍历)java代码 可直接运行
- 二叉树的遍历(递归遍历)
- 二叉树的非递归遍历(递归和非递归)
- 二叉树的遍历(递归+非递归+层次遍历)
- 超酷的句子---值得一看!!!!
- Java软件架构师所要需的东西
- fffff
- windows下的TCP并发ECHO服务器
- 阶乘位数的计算
- 二叉树的遍历(代码递归和数据递归)
- 单例模式实现hibernate连接
- 2003操作系统10例配置技巧
- freebsd 自动补全命令
- ADF开发中一些技术介绍
- 抽空看了一下 dockpanel suite, 知道如何用了, 立此存照(转载)
- Creating A Bootable WinPE 2.0 USB Key
- 你还是会觉得很快乐
- 格式化文本信息