Binary Tree Preorder Traversal on LeetCode in Java

二叉树的非递归前序遍历,大抵是很多人信手拈来、不屑一顾的题目罢。然而因为本人记性不好、基础太差的缘故,做这道题的时候居然自己琢磨出了一种解法,虽然谈不上创新,但简单一搜也未发现雷同,权且记录,希望于人于己皆有帮助。

估计能看到这里的读者,都是见过题目的,但还是链接原题在此:Binary Tree Preorder Traversal

 二话不说,直接上代码:

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public ArrayList<Integer> preorderTraversal(TreeNode root) {
12         // IMPORTANT: Please reset any member data you declared, as
13         // the same Solution instance will be reused for each test case.
14         ArrayList<Integer> res = new ArrayList<Integer>();
15         if (root == null) {
16             return res;
17         }
18         
19         TreeNode curr = root;
20         Stack<TreeNode> rights = new Stack<TreeNode>();
21         while (curr != null) {
22             res.add(curr.val);
23             if (curr.right != null) {
24                 rights.push(curr.right);
25             }
26             curr = curr.left;
27             if (curr == null && !rights.empty()) {
28                 curr = rights.pop();
29             }
30         }
31 
32         return res;
33     }
34 }

一次过,372 ms,C++ 大牛勿笑。。。Java 大牛也包涵。。。

做出来之后想搜搜有木有(基本上肯定有)更高级的解法,于是发现了教科书一般的景象。。。无论是 C++ 还是 Java,代码总有相同的一处,就是根节点入栈,出栈之后再判断左右孩子是否为空。本人猜想这一定是某本或者某些教科书里的标准解法,被大家铭记在心了。

教科书解法或许更有教学意义,或许更普适通用,但本人的小解法,用来对付这道题已经足够。

前序遍历只需保存当前节点的右孩子,当前节点不用在栈里打个来回,直接痛快把自己的值交出来,然后把皇位让给左孩子便是了~

不过后面一道后序遍历的还木有做出来。。。继续努力!

大家光棍成双节快乐!

posted @ 2013-11-11 15:48  白国舜  阅读(407)  评论(0)    收藏  举报