剑指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的使用还要多加练习。

posted @ 2019-05-16 20:57  妮妮熊  阅读(165)  评论(0编辑  收藏  举报