今天再讨论一下二叉树,时隔将近一个月,二叉树操作基本上又忘光了。。。- -!
那么实现递归的二叉树,就是不断的去寻找子树中的元素,
前序遍历就是中间节点->左子树->右子树
那么用递归的方法去实现这个前面的文章已经讲过了,在此不过多赘述~
非递归怎么实现呢?很多读者都知道栈这个数据结构吧,它是一种LIFO(Last In First Out)后进先出的数据结构,
所以我们可以这样来想,一个树,有左子树和右子树,
前序遍历
中->左->右
举个例子
88
55 99
44 66 87 101
这是个二叉树
当我们新建个栈,首先88(root)进栈
当前栈就有个88,
88出栈
88的左右节点进栈,注意,栈这个节点是后进先出。
所以我们先将右节点压入栈内,99入栈,55入栈,
55出栈,55有左节点,44,66
66,44依次入栈,,
44出栈,44没有子节点
66出栈,66没有子节点,
此时栈中剩余99,99出栈,
101入栈,87入栈,
101出栈,87出栈。
我们再看个图
这两张图其实也很形象了,就是用栈的性质进行入栈和出栈操作。
具体代码如下
public void preOrderNR(Node node) {
if (node == null) {
return;
}
Stack<Node> nodeStack = new Stack<Node>();
nodeStack.push(node);
while (!nodeStack.isEmpty()) {
Node cur = nodeStack.pop();
System.out.println(cur.e);
nodeStack.push(cur.right);
nodeStack.push(cur.left);
}
}