zoukankan      html  css  js  c++  java
  • 剑指offer系列1:重建二叉树

    剑指offer第6题:重建二叉树

      1 #include<iostream>
      2 #include<vector>
      3 #include<stack>
      4 using namespace std;
      5 struct TreeNode {
      6        int val;
      7        TreeNode *left;
      8        TreeNode *right;
      9        
     10        TreeNode(int x) :
     11               val(x), left(NULL),right(NULL) {
     12        }  
     13        static void PreOrder(TreeNode* root)
     14        {
     15            if (root == NULL)                                                                                    //开始忘记写节点为空返回,报错了。这个一定要记住!
     16            {
     17                return;
     18            }
     19            cout << root->val;
     20            PreOrder(root->left);
     21            PreOrder(root->right);
     22        }
     23        static void InOrder(TreeNode* root)
     24        {
     25            if (root == NULL)
     26            {
     27                return;
     28            }
     29            InOrder(root->left);
     30            cout << root->val;
     31            InOrder(root->right);
     32        }
     33  };
     34 class Solution {
     35 public:
     36     TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin)
     37     {
     38         if (pre.size() != vin.size())
     39         {
     40             cout << "length not equal" << endl;
     41             return NULL;
     42         }
     43         if (pre.size() == 0)
     44         {
     45             cout << "length=0" << endl;
     46             return NULL;
     47         }
     48         int rootval = pre[0];
     49         TreeNode *TreeRoot = new TreeNode(rootval);
     50         int length = pre.size();
     51         int sig = 0;
     52         for (int i = 0; i < length; i++)
     53         {
     54             if (vin[i] == rootval)
     55             {
     56                 sig = i;
     57                 break;
     58             }
     59         }
     60         int lengthOfLeft = sig;
     61         int lengthOfRight = length-sig-1;
     62         vector<int> leftpre(lengthOfLeft), leftin(lengthOfLeft);
     63         vector<int> rightpre(lengthOfRight), rightin(lengthOfRight);
     64         /*                                                                                                         //将左子树和右子树一起建立
     65             for (int i = 0; i < length; i++)
     66             {
     67 
     68                 if (i < sig)
     69                 {
     70                     leftpre[i] = pre[i + 1];
     71                     leftin[i] = vin[i];
     72                 }
     73                 if (i > sig) 
     74                 {
     75 
     76                     for (int i = sig + 1, j = 0; i < length, j < lengthOfRight; i++, j++)
     77                     {
     78                         rightpre[j] = pre[i];
     79                         rightin[j] = vin[i];
     80                     }
     81                 }
     82             }
     83             */
     84         if (lengthOfLeft > 0)                                                                                       //分开建立,建立左子树
     85         {
     86             for (int i = 0; i < lengthOfLeft; i++)
     87             {
     88                 leftpre[i] = pre[i + 1];
     89                 leftin[i] = vin[i];
     90             }
     91         }
     92         if (lengthOfRight > 0)                                                                                      //建立右子树
     93         {
     94             for (int i = sig+1,j=0; i < length, j < lengthOfRight; i++,j++)
     95             {
     96                 rightpre[j] = pre[i];
     97                 rightin[j] = vin[i];
     98             }
     99         }
    100     
    101 
    102 
    103         TreeRoot->left = reConstructBinaryTree(leftpre, leftin);
    104         TreeRoot->right = reConstructBinaryTree(rightpre, rightin);
    105 
    106         return TreeRoot;
    107 
    108     }
    109 };
    110 int main()
    111 {
    112     int pre[] = { 1,2,4,7,3,5,6,8 };
    113     int in[] = { 4,7,2,1,5,3,8,6 };
    114     vector<int> preorder(pre, pre + 8);
    115     vector<int> inorder(in, in + 8);
    116     Solution so;
    117     TreeNode * root= so.reConstructBinaryTree(preorder, inorder);
    118     cout << "PreOrder";
    119     TreeNode::PreOrder(root);
    120     cout << endl;
    121 
    122     cout << "InOrder ";
    123     TreeNode::InOrder(root);
    124     cout << endl;
    125 
    126     return 0;
    127 }

    这道题不难,但是做的时候还是有一些细节问题。

    链表是随机存储的增删简单的数组,而树是加了一个指针的链表。

    对于vector的使用还要多加练习。

  • 相关阅读:
    第二阶段冲刺第三天
    第二阶段冲刺第二天
    第二阶段冲刺第一天
    软件工程概论第十四周学习进度
    软件工程概论第十三周学习进度
    软件工程概论第十二周学习进度
    搜狗输入法
    冲刺第十天
    第二阶段冲刺第七天
    第二阶段冲刺第六天
  • 原文地址:https://www.cnblogs.com/neverland0718/p/10877955.html
Copyright © 2011-2022 走看看