ps:因为今天是从早上到晚8点没有太多的时间学习,只能学一点,但一点也是一点也要学!保持学习的状态
静态树
静态数是死板的创建过程,无实际作用,只是为了更好的理解二叉树(静态二叉树)
利用递归的方法,采用先序的方法 : 根 左 右
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
typedef struct treeNode
{
char date ;
struct treeNode* LChild;
struct treeNode* RChild;
}Tree,*LPTree;
LPTree creatNode(char date)
{
LPTree newNode =(LPTree)malloc(sizeof(Tree));
newNode->date =date;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
void insertNode(LPTree parentNode,LPTree LChild,LPTree RChild)
{
parentNode->LChild=LChild;
parentNode->RChild=RChild;
}
//打印当前节点中的元素
void printfCurNodeDate(LPTree curDate)
{
printf("%c\t",curDate->date);
}
//先序方法 :根 左 右
void preOrder(LPTree root)
{
if(root!=NULL)
{
printfCurNodeDate(root);
preOrder(root->LChild);
preOrder(root->RChild);
}
}
int main()
{
//死板的创建过程无实际作用,只是为了更好的理解二叉树(静态二叉树)
LPTree A = creatNode('A');//创造节点
LPTree B = creatNode('B');
LPTree C = creatNode('C');
LPTree D = creatNode('D');
LPTree E = creatNode('E');
LPTree F = creatNode('F');
LPTree G = creatNode('G');
insertNode(A,B,C);//将节点连接 也就是连成二叉树的形状
insertNode(B,D,NULL);
insertNode(D,NULL,G);
insertNode(C,E,F);
preOrder(A);//只要输入根 打印出整个二叉树
system("pause");
return 0;
}
第二个方法,用遍历来打印
因为我们是根据根 左 右的顺序 所以核心思想就是左边一路走到底直到无路可走
1.把走过的点入栈
2.打印走过的节点
3.无路可走时出栈
4.检察栈顶元素是否为空,为空,为空返回第三步,不为空返回第1步骤
…
今天就先这样吧,明天继续干活.
10000小时计划
32h
——————————————
来补充说明遍历打印了
遍历函数
void preOrderByStack(LPTree root)
{
if(root==NULL)//如果根节点为空退出循环
return;
//准备栈
LPTree stack[10];//用数组栈比较方便,不用去写栈的代码
int stackTop = -1; //栈顶标记
LPTree pMove=root;
while(stackTop!=-1 || pMove)//当栈顶不为空或根节点不为空
{
while(pMove)
{
printf("%c\t",pMove->date);//打印根节点
stack[++stackTop]=pMove; //储存根节点,入栈
pMove=pMove->LChild;//因为采取的是根左右的先序,左边根节点一路到底
}
//退出循环时,说明已经无路可走了
if(stackTop!=-1)
{
pMove = stack[stackTop];//我们要出栈,出栈前先获取栈顶元素;
stackTop--;
pMove = pMove->RChild;//指向右边,再次循环
}
}
}