給出中後或者前中遍歷,確定乙個二叉樹

2021-09-19 08:46:56 字數 1627 閱讀 8771

前序遍歷:先訪問根節點,在訪問左節點,在右節點

中序遍歷:現訪問左節點,在訪問根節點,在右節點

後序遍歷:現訪問左節點,在訪問右節點,在根節點(順序以根節點為基準)

二叉樹的遍歷:分為前中和後中(一定要有中序遍歷才能確定乙個二叉樹)

例如:前中序遍歷:

前序:abdfecghi

中序:dbefaghci

思路:前序遍歷中的第乙個節點a一定是根節點,據此,我們在中序遍歷裡找到a,這個a把中序數組分為左(dbef)右(ghci)兩部分(左是左兒子,右邊是右兒子),然後前序第二個b,一定是左部分(dbef)的根節點,然後遞迴即可

#include#includechar pre[50];前序點

char mid[50];中序點

char s[50];儲存二叉樹的節點

int len;點的個數

int i=0;作為pre的下標移動

void dff(int k,int beg,int end)k是左右兒子節點下標,beg、end分別是中序陣列裡的起始點和結束點

if(j>end) return; 這個條件找了很久,作用是根節點沒有孩子,則終止遞迴

s[k]=key;

i++;

printf("k=%d key=%c\n",k,key);列印這棵樹

dff(2*k,0,j-1);

dff(2*k+1,j+1,end);

}int main(void)

上面的**其實是錯的,正確是把遞迴左二子改為dff(2*k,beg,j-1);是由於左邊範圍沒選好,才需要if(j>end) return;

正確**,

#include#includechar pre[50];

char mid[50];

char s[50];

int len;

int i=0;

void dff(int k,int beg,int end)

s[k]=key;

i++;

printf("k=%d key=%c\n",k,key);

dff(2*k,beg,j-1);

dff(2*k+1,j+1,end);

}int main(void)

由於兒子們的範圍選取不當,導致下面**擼了很長時間,錯誤之處還在於左二子的範圍不當,導致錯誤判斷這個遞迴主體思路的正確性。不過這次我們先遍歷右子樹,是因為後序遍歷的性質。

後序遍歷:defbhgica

中序遍歷:dbefaghci

#include#includechar back[50];

char mid[50];

char s[50];

int len;

int i;

void dff(int k,int beg,int end)

s[k]=key;

printf(" k=%d key=%c\n",k,key);

i--;

dff(2*k+1,j+1,end);

dff(2*k,beg,j-1);

}int main(void)

我們可以用結構體或者二叉鍊錶來儲存這顆樹。

二叉樹的遍歷(前中後)

總體來說分為遞迴和非遞迴實現 前序遍歷 二叉樹前序遍歷dlr public static void preorder treenode rootnode 前序非遞迴實現,借助棧,先進後出 param public static void preordernonrecursive treenode r...

二叉樹的迭代遍歷(前,中,後)

目錄 1 迭代方式的前序遍歷 2 迭代方式的中序遍歷 3 迭代方式的後續遍歷 class solution stacks new stack while root null s.isempty root s.peek s.pop root root.right return res 思路 採用棧作為...

二叉樹的前中後層遍歷

package com.data.tree public class bitree package com.data.tree classname treetest description todo author payphone date 2018年12月24日 下午1 44 07 version...