1. 程式人生 > >二叉樹的遍歷演算法(遞迴與非遞迴)

二叉樹的遍歷演算法(遞迴與非遞迴)

        二叉樹的常用遍歷演算法有前序,中序,後序三種遍歷方法,可用遞迴及非遞迴方法實現,程式碼如下:

public class BSTTraversal {

	public static class Node{
		private int value;
		private Node leftNode;
		private Node rightNode;
		public Node(int value, Node leftNode, Node rightNode){
			this.value = value;
			this.leftNode = leftNode;
			this.rightNode = rightNode;
		}
	}
	
	//遞迴先序遍歷
	public void preOrder(Node node){
		if(node==null) return;
		printNode(node);
		if(node.leftNode!=null) preOrder(node.leftNode);
		if(node.rightNode!=null) preOrder(node.rightNode);
	}
	
	//遞迴中序遍歷
	public void inOrder(Node node){
		if(node==null) return;
		if(node.leftNode!=null) inOrder(node.leftNode);
		printNode(node);
		if(node.rightNode!=null) inOrder(node.rightNode);
	}
	
	//遞迴後序遍歷
	public void postOrder(Node node){
		if(node==null) return;
		if(node.leftNode!=null) postOrder(node.leftNode);		
		if(node.rightNode!=null) postOrder(node.rightNode);
		printNode(node);
	}
	
	//非遞迴先序遍歷
	public void preOrderNoRecursion(Node node){
		if(node==null) return;
		Stack<Node> stack = new Stack<Node>();
		stack.push(node);
		while(!stack.isEmpty()){
			Node t = stack.pop();
			printNode(t);
			if(t.rightNode!=null) stack.push(t.rightNode);
			if(t.leftNode!=null) stack.push(t.leftNode);			
		}
	}
	
	//非遞迴中序遍歷
	public void inOrderNoRecursion(Node node){
		if(node==null) return;
		Stack<Node> stack = new Stack<Node>();
		Node p = node;
		while(p!=null||!stack.isEmpty()){
			if(p!=null){
				stack.push(p);
				p = p.leftNode;
			}else{
				p = stack.pop();
				printNode(p);
				p = p.rightNode;
			}
		}
	}
	
	//非遞迴後序遍歷
	public void postOrderNoRecursion(Node node){
		if(node==null) return;
		Stack<Node> stack = new Stack<Node>();
		//這裡flag來標記是棧頂出棧或者左孩子進棧
		boolean flag = true;
		Node p = node;
		//這裡pre來記錄最近出棧的節點(用於判斷pre是否是p的右孩子,如果是,才可訪問p節點)
		Node pre = p;
		while(p!=null||!stack.isEmpty()){
			if(p!=null&&flag){
				stack.push(p);
				p = p.leftNode;
			}else{
				if(stack.isEmpty()) return;
				p = stack.peek();
				if(p.rightNode!=null&&p.rightNode!=pre){
					p = p.rightNode;
					flag = true;
				}else{
					p = stack.pop();
					printNode(p);
					flag = false;
					pre = p;
				}
			}
		}
	}
	
	private void printNode(Node node) {
		System.out.print(node.value+" ");
	}

	public static void main(String[] args) {
		Node node1 = new Node(4,null,null);
		Node node2 = new Node(8,null,null);
		Node node3 = new Node(12,null,null);
		Node node4 = new Node(16,null,null);
		Node node5 = new Node(6,node1,node2);
		Node node6 = new Node(14,node3,node4);
		Node node7 = new Node(10,node5,node6);
		BSTTraversal bst = new BSTTraversal();
		System.out.print("先序遞迴:");bst.preOrder(node7);
		System.out.print("先序非遞迴:");bst.preOrderNoRecursion(node7);
		System.out.print("中序遞迴:");bst.inOrder(node7);
		System.out.print("中序非遞迴:");bst.inOrderNoRecursion(node7);
		System.out.print("後序遞迴:");bst.postOrder(node7);
		System.out.print("後序非遞迴:");bst.postOrderNoRecursion(node7);
	}

}

相關推薦

演算法實現先序中序和後續實現中序和先續

二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {

C語言版演算法——包含前、中、後序和層次,前、中、後序和層次共八種

#include <stdlib.h> #include <stdio.h> #include "BiTree.h" #include "LinkStack.h" #include "LinkQueue.h" //初始化二叉樹(含根節點) void InitBiTree(pBiTr

演算法重構2

上一篇(https://blog.csdn.net/To_be_to_thought/article/details/84668630)介紹了二叉樹的性質和常用的相關的遞迴、非遞迴演算法,這一篇想接著寫從二叉樹的遍歷結果重構一棵樹,主要是重構的過程思路。 1.中序遍歷和先根遍歷結果重構二叉樹演算

總結先序||中序||後序||按層||之字&&||

先序遍歷:8 6 5 7 10 9 11 後序遍歷:5 7 6 9 11 10 8 中序遍歷:5 6 7 8 9 10 11 按層遍歷:8 6 10 5 7 9 11 之字遍歷:8 10 6 5 7

——c++

比較 方便 || 遍歷二叉樹 找到 保存 們的 order out 二叉樹——遍歷篇 二叉樹很多算法題都與其遍歷相關,筆者經過大量學習並進行了思考和總結,寫下這篇二叉樹的遍歷篇。 1、二叉樹數據結構及訪問函數 #include <stdio.h> #includ

C++前、中、後序,層次、深度

一.使用c++進行前中後遍歷,層次和深度遍歷(非遞迴) 二.程式碼 #include<iostream> #include<queue> #include<vector> #include<stack> using name

演算法之三:後序

後續遍歷的遞迴實現 後續遍歷指的是先訪問節點的左右孩子,最後訪問節點本身。所以使用後序遍歷得到的結果的最後一個節點就是根節點。採用後續遍歷的具體步驟如下: 先訪問根節點,如果有左孩子,進入第二步;如果有右孩子,進入第三步 對左孩子繼續判斷其是否有左孩子,直

題解已知中序,層次,求後序

題目: 樹和二叉樹基本上都有先序、中序、後序、按層遍歷等遍歷順序,給定中序和其他一種遍歷的序列就可以確定一棵二叉樹的結構。 假設一棵二叉樹一個結點用一個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。 輸入: 輸入共兩行,每行是由字母組成的字串(一行的每個字元

演算法

作者:石鍋拌飯  原文連結 二叉樹的遍歷演算法有多種,典型的有先序遍歷、中序遍歷、後序遍歷以及層序遍歷。而且這些遍歷的遞迴演算法較為簡單,程式碼很少,容易實現,本文就是彙總二叉樹遍歷的遞迴演算法,非遞迴演算法將在下一篇文章中進行總結。本文中用到的二叉樹例項如下:

迴圈和

遞迴 1.前序遍歷 void preorder(BinTree *T) { if(T==NULL) return; cout << T->data; preorder(T->left); preorder(T->rig

演算法

二叉樹遍歷的非遞迴演算法(java實現) package com.mpackage.tree; import java.util.*; public class TreeSolution { //先根遍歷 public static ArrayList

演算法實現

linux c++ 模板類 討論範圍 本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。 中序遍歷 template <typename T>void Post<T>

前序+

題目 Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes’ values. For example: Given binary

中序+

Binary Tree Inorder Traversal(二叉樹中序遍歷) Given a binary tree, return the inorder traversal of its nodes’ values. For example: Given binary tree{

/ 模板??

遞迴版 void First_order_traversal(int i) //先序 { printf("%d\n", key[i]); First_order_traversal(lc[i]);

已知中序和按層求先序

二叉樹遍歷(flist) 時間限制: 1000 ms         記憶體限制: 65536 KB 提交數: 8     通過數: 6  【題目描述】 樹和二叉樹基本上都有先序、中序、後序、按層遍歷等遍歷順序,給定中序和其它一種遍歷的序列就可以確定一棵二叉樹的結構。

四種方式、迭代及的實現

二叉樹的常見遍歷方式主要有前序,中序和後序,以及層次遍歷(從上到下,從左到右)四種方法。 前、中、後遍歷分別順序如下: 分別通過遞迴和迴圈的方式實現(Python): # -*- coding:utf-8 -*- class TreeNode: def __

演算法

在前一篇文章二叉樹遍歷遞迴演算法對二叉樹遍歷的遞迴演算法做了總結,這篇文章就來對二叉樹遍歷的非遞迴演算法做個彙總。還是與上一篇文章一樣的順序,一一彙總先序、中序、後序以及層序遍歷的非遞迴演算法。 1、先序遍歷(非遞迴演算法) 先序遍歷非遞迴訪問,使用棧即可實現。先序遍

資料結構----演算法實現

#include <stdio.h>   #include <stdlib.h>   #include <string.h>      #define OK 0;   #define ERROR -1   #define OVERFLOW

不需要棧的演算法

talk is cheap, show you the code ... #include<stdio.h> #include<stdlib.h> struct tNode { int data; struct tNode* lef