C 二叉树模板及笔记 原创
Intro
1. 熟练掌握栈的定义、特性和栈的抽象数据类型,
定义
是 限定 仅在队尾 进行插入或删除操作的 先行比爱
特性
表尾端 栈顶 top
后进先出 原则
抽象数据类型
P57
2. 栈与递归的关系
递归
定义是递归的
存在一个函数 过程 数据结构 定义的内部 直接或者间接 出现定义本身的应用, 则称为递归的
阶乘 分治法
数据结构是递归的
LNode 结点 由 data next 组成,而next本身是一种指向LNode 的指针 即LNode定义中调用了自身, 所以连表示一种递归的数据结构
链表 二叉树
问题的解法是递归的
问题本身没有明显的递归结构,但是递归求解比迭代求解更加简单
Hanoi 八皇后 迷宫
关系
函数执行中,需要多次自我调用
调用函数和被调用函数之间的连接及信息交换需要通过栈来进行
多个函数嵌套调用时,按找“先调用后返回”的原则,函数之间的信息传递和控制转移必须由 栈 来进行,及系统将整个程序运行时所需要的数据空间安排在一个栈当中,没调用一个函数就在站定分配一个储存区,当一个函数退出时,就是放它的储存区,则当前执行的函数的数据必然在栈顶
DevLog
sqStack 中 感觉很顺利
不得不说 我他妈逐渐原谅了 书上的代码
仔细看看(并不是很仔细) 也挺有道理的
&s 直接改变本身 这个还是想提一下
&e 直接返回给自己
Elem *base; Elem *top; 两个指针的用法与好处还是非常明显 毕竟我之前用顺序栈的时候都是直接刚过去… 那想过这个
*s.top++ = e; 这种简写方式 初看也是有点蛋疼的 真牛皮啊 不得不想起 >>1 这种蛋疼操作
进制转换部分
在输出结果部分一直出错 一支无输出结果
神奇
排查之后 发现是 while (!(StackEmpty(s))) 返回结果
-1 取反 为0
真实
太真实了
Status StackEmpty 空时 返回值改为 return 0 就OK
就这都坑了我半小时?…
另外 书上的 Status conversion(int N) 感觉不全
改为
Status conversion(sqStack &s, int n, int key)
{
InitStack(s);
while (n)
{
Push(s, (n%key));
n /= key;
}
while (!(StackEmpty(s)))
{
Elem e;
Pop(s, e);
cout << e;
}
return 1;
}
书上 无 StackEmpty(s) 添加为
Status StackEmpty(sqStack &s)
{
if (s.top == s.base)
return 1;
else return 0;
}
3.括号匹配
这个题 好理解 是真的好理解
看输入 选择 加flag 关门
但是我犯了几个小错误 不得不提
3.1 视频代码 的 ‘(’||‘[’是错误的!
3.2 真的要加break 不然我 pop 连续两下 人都傻了
3.3 原本我是 Status GetTop 这里有问题 返回值 所以我改成了 Elem GetTop 啊 以前感觉是装逼用的 elem 现在察觉真好用啊 大家一次解决
理解是理解啊 看着是真麻烦
链表二叉树
#include<iostream>
#include<cstdio>
using namespace std;
typedef int Status;
typedef char Elem;
typedef struct BiTNode //猜猜问什么叫BiTNode 我猜是因为全称是 Binary Tree Node 二叉树结点的意思
{
/* data */
Elem data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//中序遍历 我叫你怎么猜 看前缀 in
void InOrderTraverze(BiTree T)
{
if (T)
{
InOrderTraverze(T->lchild);
cout << T->data;
InOrderTraverze(T->rchild);
}
}
void CreatBiTree(BiTree &T)
{
//这里用的是 先序遍历方式 什么 你问什么是先序遍历?
//就是把上面的cout和他上面一行换个位置
char ch;
cin >> ch;
if (ch == '#') T = NULL; //空树
else
{
T = new BiTNode;
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
Status Copy(BiTree T, BiTree &NewT) //你看这个&加的明显就是A赋值给B
{
//这一段书本上的代码出现了错误!
//如果 T == NULL 返回 这样的话 NewT为空的情况将不会被复制!
if (!T)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
}
}
int petch(BiTree T)
{
if (!T) return 0;
else
{
//后序遍历 回溯的时候深度加上来
int m = petch(T->lchild);
int n = petch(T->rchild);
if (m > n) return m + 1;
else return n + 1;
}
}
int NodeCount(BiTree T)
{
if (!T) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild);
}
int main()
{
//ABC##DE#G##F###
BiTree T, NewT;
//1
CreatBiTree(T);
//1
InOrderTraverze(T);
//1
cout << petch(T);
//1
cout << NodeCount(T);
//1
Copy(T, NewT);
InOrderTraverze(NewT);
}

浙公网安备 33010602011771号