摘要:對(duì)于任一重合元素,保證所在兩個(gè)局部遍歷有序,保證實(shí)現(xiàn)整體遍歷有序重合元素所在局部局部全部有序,遍歷該元素并出棧局部未全部有序,將未有序局部元素全部入棧。
二叉樹(shù)遍歷小結(jié) 聲明
文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處:
[1] https://segmentfault.com/u/yzwall
[2] blog.csdn.net/j_dark/
二叉樹(shù)遍歷:按照既定序,對(duì)每個(gè)節(jié)點(diǎn)僅訪(fǎng)問(wèn)一次;
二叉樹(shù)非遞歸遍歷思想:參考這篇博文,核心思想是存在重合元素的局部有序保證整體有序,由于二叉樹(shù)的結(jié)構(gòu)特點(diǎn),二叉樹(shù)中的每個(gè)節(jié)點(diǎn)(除根節(jié)點(diǎn)和葉子節(jié)點(diǎn))均屬于兩個(gè)局部的重合元素。對(duì)于任一重合元素,保證所在兩個(gè)局部遍歷有序,保證實(shí)現(xiàn)整體遍歷有序;
重合元素所在局部:
局部全部有序,遍歷該元素并出棧;
局部未全部有序,將未有序局部元素全部入棧。由于棧是LIFO,局部元素按照逆序入棧;
二叉樹(shù)節(jié)點(diǎn)TreeNode聲明
public class TreeNode { public int val; public TreeNode left, right; public TreeNode(int val) { this.val = val; this.left = this.right = null; } }1 前序遍歷
lintcode 二叉樹(shù)的前序遍歷
1.1 非遞歸實(shí)現(xiàn)public class Solution { private class Pair { public TreeNode node; public boolean isVisited; public Pair(TreeNode node, boolean isVisited) { this.node = node; this.isVisited = isVisited; } } public ArrayList1.2 遞歸實(shí)現(xiàn)preorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } ArrayDeque stack = new ArrayDeque (); stack.push(new Pair(root, false)); while (!stack.isEmpty()) { Pair top = stack.pop(); // 重合節(jié)點(diǎn)完成所有局部有序,彈出 if (top.isVisited) { list.add(top.node.val); } else { // reverse: right -> left -> root if (top.node.right != null) { stack.push(new Pair(top.node.right, false)); } if (top.node.left != null) { stack.push(new Pair(top.node.left, false)); } stack.push(new Pair(top.node, true)); } } return list; } }
public class Solution { public ArrayList2 中序遍歷preorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } traverse(list, root); return list; } private void traverse(ArrayList list, TreeNode root) { if (root == null) { return; } list.add(root.val); traverse(list, root.left); traverse(list, root.right); } }
lintcode 二叉樹(shù)的中序遍歷
2.1 非遞歸實(shí)現(xiàn)public class Solution { private class Pair { public TreeNode node; public boolean isVisited; public Pair(TreeNode node, boolean isVisited) { this.node = node; this.isVisited = isVisited; } } public ArrayList2.2 遞歸實(shí)現(xiàn)inorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } ArrayDeque stack = new ArrayDeque (); stack.push(new Pair(root, false)); while (!stack.isEmpty()) { Pair top = stack.pop(); if (top.isVisited) { list.add(top.node.val); } else { // reverse: right -> root -> left if (top.node.right != null) { stack.push(new Pair(top.node.right, false)); } stack.push(new Pair(top.node, true)); if (top.node.left != null) { stack.push(new Pair(top.node.left, false)); } } } return list; } }
public class Solution { public ArrayList3 后序遍歷inorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } traverse(list, root); return list; } private void traverse(ArrayList list, TreeNode root) { if (root == null) { return; } traverse(list, root.left); list.add(root.val); traverse(list, root.right); } }
lintcode 二叉樹(shù)的后序遍歷
3.1 非遞歸實(shí)現(xiàn)public class Solution { private class Pair { public TreeNode node; public boolean isVisited; public Pair(TreeNode node, boolean isVisited) { this.node = node; this.isVisited = isVisited; } } public ArrayList3.2 遞歸實(shí)現(xiàn)postorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } ArrayDeque stack = new ArrayDeque (); stack.push(new Pair(root, false)); while (!stack.isEmpty()) { Pair top = stack.pop(); if (top.isVisited) { list.add(top.node.val); } else { // reverse: root -> right -> left stack.push(new Pair(top.node, true)); if (top.node.right != null) { stack.push(new Pair(top.node.right, false)); } if (top.node.left != null) { stack.push(new Pair(top.node.left, false)); } } } return list; } }
public class Solution { public ArrayList4 層序遍歷postorderTraversal(TreeNode root) { ArrayList list = new ArrayList (); if (root == null) { return list; } traverse(list, root); return list; } private void traverse(ArrayList list, TreeNode root) { if (root == null) { return; } traverse(list, root.left); traverse(list, root.right); list.add(root.val); } }
lintcode 二叉樹(shù)的層序遍歷,BFS按層遍歷實(shí)現(xiàn)
public class Solution { public ArrayList> levelOrder(TreeNode root) { ArrayDeque queue = new ArrayDeque (); ArrayList > list = new ArrayList >(); if (root == null) { return list; } queue.offer(root); while (!queue.isEmpty()) { int level = queue.size(); ArrayList levelList = new ArrayList (); // 按層BFS遍歷 for (int i = 0; i < level; i++) { TreeNode head = queue.poll(); levelList.add(head.val); if (head.left != null) { queue.offer(head.left); } if (head.right != null) { queue.offer(head.right); } } list.add(levelList); } return list; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70127.html
摘要:二叉搜索樹(shù)是二叉樹(shù)的一種,其特征是左側(cè)子節(jié)點(diǎn)存儲(chǔ)比父節(jié)點(diǎn)小的值,右側(cè)子節(jié)點(diǎn)存儲(chǔ)比父節(jié)點(diǎn)大或等于父節(jié)點(diǎn)的值。實(shí)現(xiàn)和這個(gè)兩個(gè)方法其實(shí)挺簡(jiǎn)單的,最小的節(jié)點(diǎn)就在二叉搜索樹(shù)的最左反之,最大的就在最右。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)...
摘要:數(shù)據(jù)結(jié)構(gòu)試題前言這里是數(shù)據(jù)結(jié)構(gòu)系列文章,主要介紹計(jì)算機(jī)二級(jí)考試中的涉及到數(shù)據(jù)結(jié)構(gòu)的知識(shí)點(diǎn)數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)科學(xué)中處處都有存在,例如編譯系統(tǒng)要使用棧散列表語(yǔ)法樹(shù)等操作系統(tǒng)要使用隊(duì)列存儲(chǔ)管理表目錄樹(shù)等等。 數(shù)據(jù)結(jié)構(gòu) 試題前言這里是 數(shù)據(jù)結(jié)構(gòu) 系列文章,主要介紹計(jì)算機(jī)二級(jí)考試中的涉及到數(shù)據(jù)結(jié)構(gòu)的知識(shí)點(diǎn) /數(shù)據(jù)結(jié)構(gòu)在計(jì)算...
摘要:本篇主要介紹二叉樹(shù)的概念二叉樹(shù)的表示二叉樹(shù)的操作三種遍歷方式實(shí)現(xiàn)求二叉樹(shù)的子樹(shù)求節(jié)點(diǎn)的父節(jié)點(diǎn)二叉樹(shù)高度,可能是考試中的,也可能是面試中的。通常二叉樹(shù)的遍歷根據(jù)根節(jié)點(diǎn)的遍歷次序分為先根遍歷中根遍歷后根遍歷。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專(zhuān)題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇主要介紹二叉樹(shù)的概念、二叉樹(shù)的表示、二叉樹(shù)的操作(三種遍歷...
摘要:同樣結(jié)點(diǎn)樹(shù)的二叉樹(shù),完全二叉樹(shù)的深度最小。二叉樹(shù)每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域是比較自然的想法,我們稱(chēng)這樣的鏈表叫做二叉鏈表。 二叉樹(shù)的概念 二叉樹(shù)(Binary Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(空二叉樹(shù)),或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的、分別稱(chēng)為根結(jié)點(diǎn)的左子樹(shù)和右子樹(shù)的二叉樹(shù)組成。 showImg(https://seg...
閱讀 1280·2021-10-14 09:50
閱讀 1580·2019-08-30 15:54
閱讀 1040·2019-08-30 11:22
閱讀 2934·2019-08-30 10:50
閱讀 1817·2019-08-29 18:39
閱讀 3067·2019-08-29 13:07
閱讀 2090·2019-08-28 17:54
閱讀 761·2019-08-26 17:44