前序、中序、后序数组构造二叉树
前言
- "天生结构体,树图生明。"
树结点是一种含有若干个子指针和其他数据的结构体;图亦是。 - leetcode刷题教会我用数据结构表示简单问题,选用合适的算法利用计算机计算得到答案。
- 生产生活、乃至科学中的很多问题可以用方程与微积分表示,利用matlab与Python可以简化计算。
- 但,计算机本身不产生解决方案,利用已知理论进行计算。
- 但,算法吸收了组合学的成果,能够计算、化简很多问题,
- CS=硬件计算+计算方法(针对计算的化简)+组合学(对问题的化简)
树的遍历
前言
树的BFS=层序遍历,只可队列实现;
树的DFS=先序遍历=回溯法,可栈与递归实现。
栈实现
preorder_travel(TNode* T){
stack abc;
TNode *travel=T;
while(travel!=NULL||!stack.empty()){
if(travel!=NULL){
cout<<travel->val;
travel=travel->left;
if(travel->right!=NULL)
abc.push(travel->right);
}
else {
travel=stack.top();
stack.pop();
}
}
//中序遍历,太菜没想出来~~
midorder_travel(TNode* T){};
//后序遍历
back_travel(TNode* T){};
从输入构造二叉树
前序遍历构造二叉树
class Solution{
private:
public:
TreeNode* build_preorder(queue<int> &array){
TreeNode* root=new TreeNode;
if(array.front()==-1)
return NULL/nullptr;
root->val=array.front();
array.pop();
root->left=build_preorder(array);
root->right=build_preorder(array);
return root;
}
中序可以构造二叉树吗,
怎么构造?
不过中序和前序或者后序结合是能构造二叉树的
前序和中序遍历构造二叉树
中序和后序遍历构造二叉树
但是后序遍历构造二叉树如下:
class Solution{
private:
public:
TreeNode* build_postorder(queue<int> &array){
array.reverse();
build_preorder();//左右会反,但关系不大
}
层序遍历的构造——用队列实现,偷个懒,不详述~~
线索二叉树
- 先序线索二叉树
75 void Tree::_preTree(Node * root, Node * &pre) {
76 if (root == NULL) { // 空结点,不操作,返回
77 return;
78 }
79
80 if (root->lchild == NULL) { // 左孩子为空,设置前驱,前驱为pre, pre表示上一次访问过的结点
81 root->lchild = pre;
82 root->ltag = nChild; // 左标志置为 nChild 表示是前驱
83 }
84 if (pre != NULL && pre->rchild == NULL) { // 上一个结点的,即上一次访问过的结点右孩子为空,则在此时设置后继
85 pre->rchild = root;
86 pre->rtag = nChild; // 右标志置为 nChild 表示是后继
87 }
88
89 pre = root; // pre 指向当前结点,下面开始递归一次,递归时,pre作为上一次访问过的结点,即当前指向的结点
90
91 if (root->ltag == Child) { // 当前结点还有左孩子,递归一次
92 _preTree(root->lchild, pre); //执行后pre为最左子,后面的preTree以之为pre
93 }
94 if (root->rtag == Child) { // 当前结点还有右孩子,递归一次
95 _preTree(root->rchild, pre);
96 }
97 }
- 中序线索二叉树
InThread(ThreadTree &p,Thread &pre)
if(p!=NULL)
InThread(p->left,pre)
if(p->lchild==NULL)
p->lchild=pre;
p->ltag=1;
if(pre!=NULL&&p->rchild==NULL)
pre->rchild=p
pre->rtag=1;
pre=p
InThread(p->rchild,pre)
CreateInThread(ThreadTree T)
ThreadTree pre=NULL
if(T!=NULL)
InThread(T,pre)
pre->rchild=NULL
pre->rtag=1
树=二叉树=森林
愿偿少年泪,犹趁未老时!
本文来自博客园,作者:clfire,转载请注明原文链接:https://www.cnblogs.com/sky1water/p/16720552.html