二叉樹的遍歷演算法(遞迴與非遞迴)
二叉樹的常用遍歷演算法有前序,中序,後序三種遍歷方法,可用遞迴及非遞迴方法實現,程式碼如下:
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