剑指Offer-- 重建二叉树 前序中序建立二叉树


剑指Offer-- 重建二叉树  前序中序建立二叉树

AC代码:


package algorithm;

import common.TreeNode;

/**
 * 类说明
 * 
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * DELL          2017年5月17日    Create this file
 * </pre>
 * 
 */

public class ReConstructBinaryTree {
    
    public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       
      /**
       * 在C/C++中可以用指针直接标识开始 和结束 *a a++ 就可以标识数组情况 但是对Java ,可以使用数组下标的方式标识起点个结束点
       */
      TreeNode root = constructBiTree(pre, 0, pre.length-1, in, 0, in.length-1);
        
      return root;
        
    }
    
    public static TreeNode constructBiTree(int[] pre ,int startPre, int endPre, int[] in ,int startIn, int endIn){
       
//       System.out.println("startPre:"+startPre);
       if(startPre >endPre || startIn > endIn){
           return null;
       }
       TreeNode root = new TreeNode(pre[startPre]);
       // i 指的是 in 数组下标
       for(int i = startIn; i <= endIn;i++){
             if(in[i] == pre[startPre]){
                 root.left = constructBiTree(pre, startPre+1,startPre+i-startIn, in,startIn,i-1);
                 root.right = constructBiTree(pre,startPre+i-startIn+1, endPre,in , i+1, endIn);
             }
       }
       return root;
    }
    
    public static void PreOrder(TreeNode root){
        if(root != null){
            System.out.print(root.val+" ");
            PreOrder(root.left);
            PreOrder(root.right);
        }
    }
    
    public static void InOrder(TreeNode root){
        if(root != null){
            InOrder(root.left);
            System.out.print(root.val+" ");
            InOrder(root.right);
        }
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
/*        int[] a ={1,2,3,4,5,6,7,8};
        int[] b = new int[10];
        System.arraycopy(a, 0, b, 0, 3);
        for(int i = 0; i < b.length ;i++)
        System.out.print(b[i]+" ");*/
        int[] pre={1,2,4,7,3,5,6,8};
        int[] in = {4,7,2,1,5,3,8,6};
        TreeNode root = reConstructBinaryTree(pre, in);
        PreOrder(root);
        System.out.println();
        InOrder(root);
    }

}




重建二叉树:

#include<iostream>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
using namespace std;

//定义一颗二叉树
// BiNode 可以看成二叉树一个节点  *BiTree定义了一个指针变量, 表示树
typedef struct BiTNode{

    int data;
    struct BiTNode *lchild, *rchild;

}BiTNode, *BiTree;


void  createBiTree(BiTree T){

    int ch ;
    cin>>ch;
    if(ch == 9999){
       T = NULL;
    }
    else{
       T = (BiTree)malloc(sizeof(BiTNode));
      //申请内存失败 ,报错
      if(!T){
        cout<<"Get Space Error"<<endl;
      }
      (T)->data = ch;
      createBiTree(T->lchild);
      createBiTree(T->rchild);
    }
}

BiTree insert(BiTree root, int  key ){

  BiTree p = root;

  //新建一个节点 有一个父亲节点
  BiTree ptr , pa ;

  ptr =(BiTree)malloc(sizeof(BiTNode));
  if(ptr==NULL){
    cout<<"申请空间失败"<<endl;
  }
  ptr->rchild = NULL;
  ptr->lchild = NULL;
  ptr->data = key;
  pa = NULL;
  if(p == NULL){
     return ptr;
  }else{
      while(p!= NULL){
         // 标记当前到哪个点
         pa = p;
         if(key <= p->data){
             p = p->lchild;
         }else{
             p = p->rchild;
         }
      }

      if(key <= pa->data){
         pa->lchild = ptr;
      }else{
         pa->rchild = ptr ;
      }
  }
  return root ;

}

BiTree createTree(){
 BiTree root = NULL;
  int ch ;
  cin>>ch;
  while(ch != 9999){
    root = insert(root, ch);
    cin>>ch;
  }
  return root;
}

void preOrder(BiTree root){

    if(root != NULL){
      cout<<root->data<<" ";
      preOrder(root->lchild);
      preOrder(root->rchild);
    }
}

void inOrder(BiTree root){
    if(root!= NULL){
       inOrder(root->lchild);
       cout<<root->data<<" ";
       inOrder(root->rchild);
    }

}

void postOrder(BiTree root){
    if(root != NULL){
        postOrder(root->lchild);
        postOrder(root->rchild);
        cout<<root->data<<" ";
    }
}

BiTree constructBiTree(int* startpre , int* endpre, int* startin, int* endin){

    int pos;
    BiTree root;

    int rootValue = startpre[0];
    cout<<"rootValue:"<<rootValue<<endl;
    root = (BiTree)malloc(sizeof(BiTNode));
    root->lchild = NULL;
    root->rchild = NULL;
    root->data = rootValue;

    // 如果只有一个节点
    if(startpre== endin){
        if(startin == endin && *startin == *endin){
            return root;
        }else{
            cout<<"输入参数有误"<<endl;
        }
    }

    //遍历中序 找到先序节rootvalue 在中序中位置
    int *rootIn = startin;
    while(rootIn <= endin && *rootIn!=rootValue){
           rootIn++;
    }

    // 将先序数组分成两半
    int leftLength = rootIn - startin;
    int *leftEndpre = startpre + leftLength;

    if(leftLength >0){
       root->lchild = constructBiTree(startpre+1, leftEndpre,startin ,rootIn-1);
    }
    if(leftLength < endpre - startpre){
       root->rchild = constructBiTree(leftEndpre+1, endpre, rootIn+1, endin);
    }
    return root;
}

BiTree rebuildree(int *pre , int *in ,int  length){
    if(pre == NULL || in == NULL || length <=0){
        return NULL;
    }

    return constructBiTree(pre,pre+length-1, in, in+length-1);


}
int main(){

   int pre[] ={1,2,4,7,3,5,6,8};
   int in[] ={4,7,2,1,5,3,8,6};
   BiTree  root = rebuildree(pre, in,8);
//   BiTree root = createTree();
   preOrder(root);
   cout<<endl;
   inOrder(root);
   cout<<endl;
   postOrder(root);

   return 0;

}


wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值