節點和樹類:
public class treenode
public treenode(integer val)
@override
public string tostring()
}
public class tree
}
遞迴實現:
public arraylistafter(treenode node)
after(node.left);
after(node.right);
result.add(node);
return result;
}
使用棧stack實現:
方法1,將後序遍歷結果看作是按照「根-右-左」遍歷的逆序,那麼用兩個棧,乙個棧用來儲存節點,另乙個儲存逆序結果集,最後將逆序結果集出棧儲存得到正序結果集。
public arraylistafter()
treenode node = root;//當前節點
while(node != null || stack.size()!=0)else
}//出棧得到正序結果集
while(temp.size() !=0)
return list;
}
方法2,考慮空間複雜度,不用儲存結果集,立即輸出遍歷值。先把左子樹壓棧,出棧後先判斷該節點是否有右子節點或右子節點已經遍歷輸出然後繼續出棧,直到找到需要遍歷的右子節點(或遍歷結束)。
public arraylistafter3()
treenode node = root;//當前節點
treenode temp = root;//上一次遍歷的節點
while(node != null || stack.size()!=0)
node = stack.pop();
//1.沒有右子節點或右子節點已經遍歷過
while(node.right == null || node.right == temp)
//2.右子節點還沒遍歷
stack.push(node);//先把當前節點(根)入棧儲存
node = node.right;
} return list;
}
測試**:
@test
public void treetes1t()
測試樹:
輸出結果:
[treenode [value=4], treenode [value=5], treenode [value=2], treenode [value=6], treenode [value=8], treenode [value=7], treenode [value=3], treenode [value=1]]
[4, 5, 2, 6, 8, 7, 3, 1]45
2687
31
二叉樹的後序遍歷
1 問題描述 給出一棵二叉樹,返回其節點值的後序遍歷。給出一棵二叉樹 1 2 3返回 3,2,1 2 問題實現 與前序遍歷 中序遍歷類似。若二叉樹為空,則空操作返回。否則後序遍歷根節點的左子樹,後序遍歷根節點的右子樹,訪問根節點。3 definition of treenode class tree...
二叉樹的後序遍歷
如下圖表示一顆二叉樹,對它進行先序遍歷操作,採用兩種方法,遞迴和非遞迴操作。遍歷結果為 4526731。1 遞迴操作 思想 若二叉樹為空,返回。否則 1 後序遍歷右子樹 2 後序遍歷左子樹 3 遍歷根節點 void postorder bitree root 2 非遞迴操作 void postord...
二叉樹的後序遍歷
相關 其實二叉樹的後序遍歷,相當於,右左根的反向輸出,可以利用棧來進行逆向輸出,另個棧輔助遍歷過程 入棧,入輸出棧 遍歷右子樹 2.1 非空 1 2.2 空值 4 遍歷左子樹 逆向輸出 左右根 public list norecursive treenode root 設定為左子樹的右子樹if st...