二叉樹的後序遍歷BTPostorderTraversal
/*
* 後序遍歷二叉樹
* 核心思想是用棧做輔助空間,先從根節點往左一直入棧,直到爲空,然後判斷棧頂元素的右孩子,
* 如果爲空或被訪問過,說明此時棧頂爲要訪問的節點,出棧然後訪問即可;
* 否則從它開始重複左孩子入棧的過程,接下來再判斷棧頂元素的右孩子...直到棧空。
*/
public class BTPostorderTraversal
{
static class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val = x;
}
}
public static ArrayList<Integer> postorderTraversal(TreeNode root)
{
if(root == null)
{
return null;
}
ArrayList<Integer> _values = new ArrayList<Integer>();
Deque<TreeNode> _nodes = new ArrayDeque<TreeNode>();
TreeNode _pNode = root;
TreeNode _pre = null;//記錄上一個訪問的節點
while(_pNode != null || !_nodes.isEmpty())
{
while(_pNode != null)
{
_nodes.push(_pNode);
_pNode = _pNode.left;
}
_pNode = _nodes.peek();
//如果右節點爲空或右節點被訪問過,說明該節點就是要訪問的節點
if(_pNode.right == null || _pNode.right == _pre)
{
_values.add(_nodes.pop().val);
_pre = _pNode;//記錄被訪問過的節點
_pNode = null;
}
else
{
_pNode = _pNode.right;
}
}
return _values;
}
}
* 後序遍歷二叉樹
* 核心思想是用棧做輔助空間,先從根節點往左一直入棧,直到爲空,然後判斷棧頂元素的右孩子,
* 如果爲空或被訪問過,說明此時棧頂爲要訪問的節點,出棧然後訪問即可;
* 否則從它開始重複左孩子入棧的過程,接下來再判斷棧頂元素的右孩子...直到棧空。
*/
public class BTPostorderTraversal
{
static class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val = x;
}
}
public static ArrayList<Integer> postorderTraversal(TreeNode root)
{
if(root == null)
{
return null;
}
ArrayList<Integer> _values = new ArrayList<Integer>();
Deque<TreeNode> _nodes = new ArrayDeque<TreeNode>();
TreeNode _pNode = root;
TreeNode _pre = null;//記錄上一個訪問的節點
while(_pNode != null || !_nodes.isEmpty())
{
while(_pNode != null)
{
_nodes.push(_pNode);
_pNode = _pNode.left;
}
_pNode = _nodes.peek();
//如果右節點爲空或右節點被訪問過,說明該節點就是要訪問的節點
if(_pNode.right == null || _pNode.right == _pre)
{
_values.add(_nodes.pop().val);
_pre = _pNode;//記錄被訪問過的節點
_pNode = null;
}
else
{
_pNode = _pNode.right;
}
}
return _values;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.