二叉樹先序,中序,後序遍歷的遞迴及非遞迴實現

2021-09-24 12:24:34 字數 1477 閱讀 6205

準備二叉樹的結構

static class node

}

// 給二叉樹節點賦值
public static void main(string args)
一.、遞迴版

先列印當前節點,再列印它的左子樹,再列印它的右子樹的過程叫做先序遍歷。

先列印當前節點的左子樹,當前節點,再列印它的右子樹的過程叫做中序遍歷。

先列印當前節點的左子樹,再列印它的右子樹,最後列印當前節點的過程叫做後序遍歷。

// 遞迴先序遍歷

public static void presort(node head)

system.out.println(head.value);

presort(head.left);

presort(head.right);

}// 遞迴中序遍歷

public static void midsort(node head)

midsort(head.left);

system.out.println(head.value);

midsort (head.right);

}// 遞迴後序遍歷

public static void possort(node head)

possort(head.left);

possort (head.right);

system.out.println(head.value);

}

二、非遞迴版

先序遍歷,非遞迴

1.先準備乙個棧。

2.如果頭節點不為null,將頭節點壓入棧。

3.有右節點先壓入右節點

4.有左節點後壓左節點

// 非遞迴先序遍歷

public static void prenoresort(node head)

if (node.left != null) }}

}

中序遍歷,非遞迴,需要乙個輔助棧

當前節點先把自己的左邊界都壓入棧中

1.遇到左節點不為空,將左節點壓入棧中

2.當前節點為空,從棧中拿乙個列印,當前節點向右移動

3.當前節點不為空,當前節點壓入棧,當前節點往左

// 非遞迴中序遍歷

public static void midnoresort(node head)else }}

}

後序遍歷,左右中

先序和中序會回到乙個節點兩次。

1.先序遍歷是中左右,改造先序遍歷,成中右左

2.用乙個輔助棧來接受改造的先序遍歷

3.將輔助棧列印,就是後序遍歷

// 非遞迴後序遍歷

public static void posnoresort(node head)

if (head.right != null)

}while (!s2.isempty())

}}

先序建立二叉樹及先序 中序 後序遍歷

先序二叉樹 先序建立二叉樹 void createbitree bitree t t bitnode malloc sizeof bitnode t data cnt t lchild null t rchild null createbitree t lchild createbitree t r...

二叉樹先序 中序 後序遍歷

題目 用遞迴和非遞迴方式,分別按照二叉樹先序 中序和後序列印所有的節點。我們約定 先序遍歷順序為根 左 右 中序遍歷順序為左 根 右 後序遍歷順序為左 右 根。遞迴實現 遞迴遍歷二叉樹 先序 public void preorderrecur node head system.out.println...

二叉樹先序遍歷 中序遍歷 後序遍歷

輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。非建二叉樹版本 include includeusing namespace std string preord,inord void rebuild int preleft,int preright,int inleft,int ...