前序、中序、后序数组构造二叉树

前言

  • "天生结构体,树图生明。"
    树结点是一种含有若干个子指针和其他数据的结构体;图亦是。
  • 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();//左右会反,但关系不大
	}
层序遍历的构造——用队列实现,偷个懒,不详述~~

线索二叉树

  1. 先序线索二叉树
 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 }
  1. 中序线索二叉树
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

树=二叉树=森林

posted @ 2022-09-22 18:59  clfire  阅读(34)  评论(0编辑  收藏  举报