二叉樹 ---- 前序 中序 後序 知二求一

LI MING MING發表於2020-11-03

二叉樹 ---- 前序 中序 後序 知二求一

先說一下什麼是二叉樹的前中後序;
根:根節點 左代表遍歷左子樹 右代表遍歷右子樹
前序:根—左---右
中序:左—根---右
後序:左—右---根
在這裡插入圖片描述
如圖求前序:
//葉子結點簡單的說就是沒有兒子的節點;

先遍歷到a節點,再遍歷它的左子樹;

遍歷到b節點,再遍歷它的左子樹;

遍歷到c節點,發現c節點為葉子結點,返回到它的根節點b; 遍歷b節點的右子樹;

遍歷到d節點,發現d節點為葉子結點,返回到節點a;遍歷a節點的右子樹;

遍歷到e節點,再遍歷它的左子樹;發現它沒有左子樹,遍歷它的右子樹;

遍歷到f節點,發現f節點為葉子結點,遍歷結束;

中序後序自己動手推一下
前序: a b c d e f
中序: c b d a e f
後序: c d b f e a

還有前序和後序推出來的中序不唯一;

這裡還有一些練習
知道前序中序求後序
答案:

#include<bits/stdc++.h>
using namespace std;
string z;//中序
string q;//前序
void dfs(int l1,int r1,int l2,int r2) {//l1 r1 為前序,l2 r2 為中序
  if(l1 > r1 || l2 > r2) return ;
  for(int i = l1;i <= r1;i++) {
    if(z[i] == q[l2]) {
      dfs(l1,i - 1,l2 + 1,l2 + i - l1);//遍歷左子樹,i - l1 是左子樹的節點數
      dfs(i + 1,r1,l2 + i - l1 + 1,r2);//遍歷右子樹
      cout << q[l2];//因為是左右根的順序 最後輸出的就是根節點
    }
  }
}
int main() {
  cin >> z;
  cin >> q;
  int len = q.size() - 1;
  dfs(0,len,0,len);
  return 0;
}

知道中序後序求前序

#include<bits/stdc++.h>
using namespace std;
string z;
string h;
void dfs(int l1,int r1,int l2,int r2) {
  if(l1 > r1 || l2 > r2) return ;
  for(int i = l1;i <= r1;i++) {
    if(z[i] == h[r2]) {
      cout << h[r2];
      dfs(l1,i - 1,l2,l2 + i - l1 - 1);
      dfs(i + 1,r1,l2 + i - l1,r2 - 1);
    }
  }
}
int main() {
  cin >> z;
  cin >> h;
  int len = h.size() - 1;
  dfs(0,len,0,len);
  return 0;
} 

相關文章