熟悉二叉树的遍历建树过程有利于对后文线索化二叉树的学习
对于数据结构中二叉树特殊的结构,经过一段时间的温习发现自己基础并不是很牢靠,所以写下这篇博文也是记录一下自己的学习过程,给日后参考
#include <stack>
#include <iostream>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//按给定的先序序列建立二叉链表
BiTNode* BiTree_Creat12()
{
BiTNode *tmp = NULL;
char ch;
printf("\n请输入字符: ");
cin >> ch ;
if (ch == '*')
{
return NULL;
}
else
{
tmp = (BiTNode *)malloc(sizeof(BiTNode));
if (tmp == NULL)
{
return NULL;
}
else
{
tmp->data = ch; //生成根结点
tmp->lchild = BiTree_Creat12();//构建左子树
tmp->rchild = BiTree_Creat12();//构建右子数
return tmp;
}
}
}
//非递归遍历二叉树左子树
BiTNode* GoLeft(BiTNode* node, stack<BiTNode*>& mstack)
{
if (node == NULL)
{
return NULL;
}
else
{
while (node->lchild != NULL)
{
mstack.push(node);
node = node->lchild;
}
}
return node;
}
void InOrder(BiTNode* node)
{
stack<BiTNode*> stack;
node = GoLeft(node, stack);
while (node != NULL)
{
//如果节点的左子树为空 就访问该节点
printf("%c\t", node->data);
//判断右子树是不是为空 就遍历右子树
if (node->rchild != NULL)
{
node = GoLeft(node->rchild, stack);
}
else if (!stack.empty())
{
//右子树为空 就出栈返回操作
node = stack.top();
stack.pop();
}
else
{
//右子树为空 栈也为空 访问结束
node = NULL;
}
}
}
void main()
{
int nCount = 0, depthval = 0;
BiTNode * my = BiTree_Creat12();
printf("\n非递归算法c++访问\n");
InOrder(my);
printf("\n邵忠棋");
system("pause");
}