資料結構與演算法題目集7-23——還原二叉樹
阿新 • • 發佈:2018-12-05
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原題連結:https://pintia.cn/problem-sets/15/problems/838
題目描述:
知識點:根據前序遍歷和中序遍歷重建二叉樹、二叉樹的層序遍歷
思路:先根據前序遍歷和中序遍歷重建二叉樹,再層序遍歷計算高度
時間複雜度和空間複雜度均是O(N)。
C++程式碼:
#include<iostream> #include<cstring> #include<queue> using namespace std; struct node{ char c; int lchild, rchild; }; int N, num = 0; vector<char> preOrder, inOrder; node Node[50]; int height = 0; int create(int preLeft, int preRight, int inLeft, int inRight); void levelOrderTraversal(int root); int main(){ scanf("%d", &N); char input1[N + 1], input2[N + 1]; scanf("%s", input1); for(int i = 0; i < strlen(input1); i++){ preOrder.push_back(input1[i]); } scanf("%s", input2); for(int i = 0; i < strlen(input2); i++){ inOrder.push_back(input2[i]); } int root = create(0, preOrder.size() - 1, 0, inOrder.size() - 1); levelOrderTraversal(root); printf("%d\n", height); return 0; } int create(int preLeft, int preRight, int inLeft, int inRight){ if(preLeft > preRight){ return -1; } int head = num++; Node[head].c = preOrder[preLeft]; int k; for(int i = inLeft; i <= inRight; i++){ if(inOrder[i] == preOrder[preLeft]){ k = i; break; } } int numLeft = k - inLeft; Node[head].lchild = create(preLeft + 1, preLeft + numLeft, inLeft, k - 1); Node[head].rchild = create(preLeft + numLeft + 1, preRight, k + 1, inRight); return head; } void levelOrderTraversal(int root){ queue<int> q; q.push(root); while(!q.empty()){ int qSize = q.size(); for(int i = 0; i < qSize; i++){ int u = q.front(); q.pop(); if(Node[u].lchild != -1){ q.push(Node[u].lchild); } if(Node[u].rchild != -1){ q.push(Node[u].rchild); } } height++; } }
C++解題報告: