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