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

二叉樹:二叉樹的遍歷(遞迴與非遞迴)

二叉樹的前序、中序、後序遍歷:

遞迴實現:不同順序改變遞迴就行。

前序:        

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        
        List<Integer> list = new ArrayList<Integer>();
        if(root == null){
            return list; 
        }else{
            list.add(root.val);
            list.addAll(preorderTraversal(root.left));
            list.addAll(preorderTraversal(root.right));
            
        }
        return list;
       }
}            

非遞迴實現:即用棧模擬系統遞迴的實現,為了更方便理解,將節點資訊封裝一下,這樣完全模擬系統遞迴了,其他順序也只需要像遞迴實現一樣改變順序就好了。這裡不同與書本的每種順序各有個的非遞迴實現。

//非遞迴遍歷二叉樹,用stack模擬系統棧,根據遞迴思路實現,前中後一樣。
public class L144BTreeTravesal {

	public  static List<Integer> preorderTraversal(TreeNode root) {		
		List<Integer> list = new ArrayList<Integer>();
		Stack<Command> stack = new Stack<Command>();
		if(root == null){
			return list;
		}
		stack.push(new Command(false, root));
		while(!stack.isEmpty()){
			
			Command curr = stack.pop();
			if(curr.isOut){
				list.add(curr.node.val);
			}else{
				if(curr.node.right != null){
					stack.push(new Command(false,curr.node.right));
				}
				if(curr.node.left != null){
					stack.push(new Command(false,curr.node.left));
				}
				stack.push(new Command(true, curr.node));
			}
		}	
		return list;
	}
}

class Command{
	boolean isOut;
	TreeNode node;
	public Command(boolean isOut, TreeNode node) {
		this.isOut = isOut;
		this.node = node;
	}
}

 非遞迴中序遍歷:

 public static List<Integer> solution(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        if (root == null) {
            return list;
        }
        TreeNode p = root;
        Stack stack = new Stack();
        stack.push(p);
        p = p.left;
        while (!stack.isEmpty()) {
            while (p != null) {
                stack.push(p);
                p = p.left;
            }
            if (!stack.isEmpty()) {
                TreeNode temp = (TreeNode) stack.pop();
                list.add(temp.val);
                p = temp.right;
            } else {
                return list;
            }

        }
        return list;
    }

非遞迴後序遍歷:

  public static List<Integer> solution(TreeNode root){
        Stack<TreeNode> stack = new Stack();
        Stack<TreeNode> outPut = new Stack();
        List<Integer> list =  new ArrayList<Integer>();
        if (root == null) {
            return list;
        }
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode p = stack.pop();
            outPut.push(p);
            if(p.left != null){
                stack.push(p.left);
            }
            if(p.right != null){
                stack.push(p.right);
            }
        }
        while (!outPut.isEmpty() ) {
            list.add(outPut.pop().val);
        }
        return list;
    }

相關推薦

()

二叉樹的前序、中序、後序遍歷: 遞迴實現:不同順序改變遞迴就行。 前序:         class Solution { public List<Integer> preorderTraversal(TreeNode root) {

LeetCode的中序法)

二叉樹結點類: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {} }

LeetCode的前序法)

二叉樹結點類: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {} }

LeetCode的後序法)

二叉樹結點類: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}

【數據結構算法】(附完整源碼)(轉)

style stack gravity text 一個 eat 遞歸遍歷 deb 雙向 轉自:http://blog.csdn.net/ns_code/article/details/12977901 二叉樹是一種非常重要的數據結構,很多其他數據機構都是基於二叉樹的基礎

的前序、中序、後序、層次歸實現

不為 sta logs 結束 nod 遞歸實現 inorder count site 二叉樹的遍歷有前序遍歷、中序遍歷、後序遍歷、層次遍歷等,筆者在這裏總結一下各種遍歷的實現。 一.前序遍歷。 前序遍歷訪問節點順序為:根節點->左子節點->右子節點。 遞歸實現如

後序--歸實現

eno oid imp array ins hashmap nod package 實現 package tree; import java.util.ArrayList; import java.util.HashMap; import java.util.List;

的先序、中序、後序歸實現

中序遍歷 while循環 節點 非遞歸遍歷 stack left reorder push 後序 //定義二叉樹結點 struct BiTreeNode { int data; BiTreeNode* left; BiTreeNode* right

[] 方法總結----純C實現

非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include

後序)演算法及C語言實現

二叉樹後序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成後,才訪問該節點元素。 圖 1 二叉樹   如圖 1 中,對此二叉樹進行後序遍歷的操作過程為: 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點); 遍歷節點 2 的左子樹(以節點 4 為根

先序)及C語言實現

二叉樹先序遍歷的實現思想是: 訪問根節點; 訪問當前節點的左子樹; 若當前節點無左子樹,則訪問當前節點的右子樹; 圖 1 二叉樹   以圖  1 為例,採用先序遍歷的思想遍歷該二叉樹的過程為: 訪問該二叉樹的根節點,找到 1; 訪問節點 1 的左子樹,找到節點 2; 訪問節點 2 的左子

的(前,中,後)

#include<stdio.h> #include<stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }bintnode; typedef struct

的前序,中序,後序,層次方式)

以前在學校學過二叉樹的遍歷,工作後基本上沒用到,現在整理下這幾種排序演算法: 1.java的測試方法: package leetcode.TestList; /** * @author zhangyu * @version V1.0 * @ClassName: TreeNode *

【資料結構】的前中後層次()

水一波作業 #include <iostream> #include <cstring> //#pragma GCC optimize(2) #include<time.h> #include <map> #include &

資料結構——(先序,中序,後序)

實驗專案五 二叉樹基本操作的實現 課程名稱:資料結構 實驗專案名稱:二叉樹基本操作的實現 實驗目的: 1.掌握樹的基本操作—遍歷。 實驗要求: 1、 分別用遞迴和非遞迴的方法實現一棵樹的三種遍歷。 實驗過程: 建立一棵二叉樹(二叉樹如下圖所示);

筆記九的建立、版前序、中序、後序查詢、高和節點判斷

程式碼: #include<iostream> #include<vector> #include<stack> using namespace std; template<typename T> str

(版本)

最近在寫關於二叉樹方面的題目的時候,總是會用到二叉樹的各種遍歷,所以在這裡將自己寫的各種遍歷,都記錄下來. 遞迴部分: 首先二叉樹的遞迴程式碼是比較簡單的,而且前序,中序和後序遍歷程式碼幾乎一樣, 只是列印節點值的輸出語句的位置不一樣. 可以遞迴部分,對於二叉樹中節點的遍歷順序是一樣的,

python實現 的前序中序後序層次——

前序遍歷 # ------ coding:utf-8 ------- class TreeNode: def __init__(self, x): self.val = x

前序、中序、後序+層序(java)

    前序遞迴遍歷演算法:訪問根結點-->遞迴遍歷根結點的左子樹-->遞迴遍歷根結點的右子樹  中序遞迴遍歷演算法:遞迴遍歷根結點的左子樹-->訪問根結點-->遞迴遍歷根結點的右子樹  後序遞迴遍歷演算法:遞迴遍歷根結

遍歷時對樹的一種基本運算,所為遍歷二叉樹就是按一定的規則和順序走遍二叉樹的所有節點,是每一個節點都被訪問一次,有且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個節點轉化為一個現行序列來表示。 下面的程式碼就是實現樹的遍歷的遞迴與非遞