我最近开始学习计算机科学和Java编码,并遇到了Traversal技术。我正在使用Stack编写Java代码。我一直在处理这个问题,但找不到任何解决方案。无论如何我们只能使用一个堆栈来实现Post Order遍历(没有任何额外的数据结构或额外的空间)?
我试过这样做,这是我的代码。
class node {
int data;
node left, right;
node(int val){
data = val;
left = right = null;
}
}
public class binaryt {
public static void postorder(node root) {
node current = root;
Stack<node> st = new Stack<>();
System.out.println();
System.out.print("Post-order : ");
while(current!=null) {
st.push(current);
current = current.left;
}
while(!st.empty()) {
current = st.pop();
if(current.right==null) {
System.out.print(current.data+" ");
current = null;
}
else {
st.push(current);
current = current.right;
while(current!=null) {
st.push(current);
current = current.left;
}
}
}
}
public static void main(String[] args) {
node root=null;
root = new node(12);
root.left = new node(8);
root.left.left = new node(2);
root.left.right = new node(9);
root.right= new node(16);
root.right.left= new node(13);
root.right.right= new node(18);
postorder(root);
}
}
我无法找到代码有什么问题,因为它进入无限循环。如果有人能帮助我,那将是巨大的帮助。非常感谢。
学习这些讨厌的算法的最好方法是忍受一点,找到自己的解决方案,坚持你的大脑 - 所以你做的是正确的事情。这个对我来说总是很难。
你的问题
因此,您展示的尝试中可能存在一些错误。但这是我先修复的那个,然后我想你能够得到其他人:
这是您的代码中发生的事情:
while
while(!st.empty()) {
循环开始,它有元素9,8,12你也可以在控制台上看到:订购后:2 9 9 9 9 .....继续
这就是问题所在。
以下是一个解决方案:
public static void postorderIter( node root) {
if( root == null ) return;
Stack<node> s = new Stack<node>( );
node current = root;
while( true ) {
if( current != null ) {
if( current.right != null )
s.push( current.right );
s.push( current );
current = current.left;
continue;
}
if( s.isEmpty( ) )
return;
current = s.pop( );
if( current.right != null && ! s.isEmpty( ) && current.right == s.peek( ) ) {
s.pop( );
s.push( current );
current = current.right;
} else {
System.out.print( current.data + " " );
current = null;
}
}
}
这是一个依赖递归使其更具可读性的示例。
public static void postorder(node root) {
Stack<node> nodes = new Stack<>();
node curr = root;
postOrderRecursive(curr, nodes);
int size = nodes.size();
while(size > 0){
System.out.println(nodes.elementAt(0).data);
nodes.remove(0);
size = nodes.size();
}
}
private static void postOrderRecursive(node n, Stack<node> nodes){
if(n.left != null)
postOrderRecursive(n.left, nodes);
if(n.right != null)
postOrderRecursive(n.right, nodes);
nodes.push(n);
}
初始化时的输出:2 9 8 13 18 16 12