145.二分木のポストオーダートラバーサル再帰解と非再帰解
二分木が与えられた場合、そのポストオーダートラバーサルを返します。
例:
输入: [1,null,2,3]
1
\
2
/
3
出力:[3,2,1]
詳細:再帰的アルゴリズムは非常に単純ですが、反復アルゴリズムを使用して実行できますか?
解決策1:再帰
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
postorderTraversal(root,list);
return list;
}
public void postorderTraversal(TreeNode root, List<Integer> list) {
if (root==null){
return;
}
postorderTraversal(root.left,list);
postorderTraversal(root.right,list);
list.add(root.val);
}
解決策2:反復
テンプレート
二分木の探索は、このテンプレートに基づいて考えることができます。これに基づいて、いつでも慎重に考えることができます。
while( 栈非空 || p 非空)
{
if( p 非空)
{
}
else
{
}
}
問題解決のアイデア
1. node = rootを設定します
。2。ノードがリーフノードであるか、ノードの左右のノードにアクセスした場合、要素にアクセスしてポップします。
それ以外の場合、ノードの左右のノードはスタックにプッシュされます。順番
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
if (root==null){
return list ;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode node=root;
TreeNode pre=null;
while (!stack.isEmpty()||node!=null){
if (node!=null){
stack.add(node);
node=node.left;
}else{
node = stack.peek();
/*如果当前节点的右节点为空获取右节点已经被访问过了*/
if(node.right == null || node.right == pre)
{
list.add(node.val);
pre = node;
stack.pop();
/*将node置为null取出下一个栈顶节点*/
node = null;
}
else{
node = node.right;
}
}
}
return list;
}