博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的遍历
阅读量:6252 次
发布时间:2019-06-22

本文共 3305 字,大约阅读时间需要 11 分钟。

最近做到二叉树的题目,准备对二叉树做一个归纳总结。首先写一下二叉树的几种遍历方法吧

1.二叉树的前序遍历:根左右 preorderTraversal 。也就是按照根-左-右的顺序,迭代来遍历一棵二叉树,用栈存储右子树,把根存储了之后,遍历左子树,然后左子树遍历完了,就从栈中弹出右子树的节点,依旧按照根左右顺序进行遍历柚子树。

leetcode 144. Binary Tree Preorder Traversal

代码如下:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */

 

public class Solution {    public List
preorderTraversal(TreeNode node) { List
list = new LinkedList
();//记录结果 Stack
rights = new Stack
(); //将右子树压栈 while(node!=null){ list.add(node.val); if(node.right!=null) rights.push(node.right); node = node.left; if(node==null&&!rights.isEmpty()){ node = rights.pop(); } } return list; }}

  2.二叉树的中序遍历  左右根的顺序遍历。就是先遍历完左子树,然后遍历根,最后是右子树

 

/**

* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> sta = new Stack<>();
while(root!=null||!sta.isEmpty()){
while(root!=null){
sta.push(root);
root = root.left;
}
root = sta.pop();
res.add(root.val);
root =root.right;
}
return res;
}
}

 

3.后序遍历 postorder traversal   左 右 根的顺序来遍历

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List
postorderTraversal(TreeNode root) { LinkedList
ans = new LinkedList<>(); Stack
stack = new Stack<>(); if (root == null) return ans; stack.push(root); while (!stack.isEmpty()) { TreeNode cur = stack.pop(); ans.addFirst(cur.val); if (cur.left != null) { stack.push(cur.left); } if (cur.right != null) { stack.push(cur.right); } } return ans; }}

如果不使用linkedlist 则:

/**      *       * @param root 树根节点      * 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现      */      public static void postOrderStack(Node root){          if(root==null)return;          Stack
s=new Stack
(); Map
map=new HashMap
(); s.push(root); while(!s.isEmpty()){ Node temp=s.peek(); if(temp.left!=null&&!map.containsKey(temp.left)){ temp=temp.left; while(temp!=null){ if(map.containsKey(temp))break; else s.push(temp); temp=temp.left; } continue; } if(temp.right!=null&&!map.containsKey(temp.right)){ s.push(temp.right); continue; } Node t=s.pop(); map.put(t,true); System.out.println(t.value); } }

 

 

以上均为迭代的方法。

 

转载于:https://www.cnblogs.com/CongLollipop/p/6601709.html

你可能感兴趣的文章
使用erlang 建立一个自动化的灌溉系统(1)准备工作
查看>>
python 调用aiohttp
查看>>
mysql 案例~ mysql故障恢复
查看>>
Spring Boot中使用MyBatis注解配置详解
查看>>
MatLab实现FFT与功率谱
查看>>
答《漫话ID》中的疑问:UniqueID和ClientID的来源
查看>>
【转】Asp.net控件开发学习笔记整理篇 - 服务器控件生命周期
查看>>
Linux下的shell编程(一)BY 四喜三顺
查看>>
javascript一些小技巧
查看>>
I00024 出钱买羽
查看>>
linux下文件的一些文件颜色的含义
查看>>
websotrm注册码
查看>>
迭代器(Iterable)和for..in..的三种协议
查看>>
判断浏览器是否为顶层窗口
查看>>
数据结构化与保存
查看>>
跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
查看>>
服务器设计笔记(3)-----消息队列
查看>>
poj 1797 Heavy Transportation(最短路径Dijkdtra)
查看>>
基于WinDbg的内存泄漏分析
查看>>
气象预警采集及推送
查看>>