二叉樹:二叉樹的遍歷(遞迴與非遞迴)
二叉樹的前序、中序、後序遍歷:
遞迴實現:不同順序改變遞迴就行。
前序:
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)
前序遞迴遍歷演算法:訪問根結點-->遞迴遍歷根結點的左子樹-->遞迴遍歷根結點的右子樹 中序遞迴遍歷演算法:遞迴遍歷根結點的左子樹-->訪問根結點-->遞迴遍歷根結點的右子樹 後序遞迴遍歷演算法:遞迴遍歷根結
二叉樹的遞迴與非遞迴遍歷
遍歷時對樹的一種基本運算,所為遍歷二叉樹就是按一定的規則和順序走遍二叉樹的所有節點,是每一個節點都被訪問一次,有且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個節點轉化為一個現行序列來表示。 下面的程式碼就是實現樹的遍歷的遞迴與非遞