供自己或有需要的朋友查询参考。如有错误请帮忙指明,谢谢。
二叉树的遍历有:
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
前序遍历
递归实现
public void preOrderTraverse(TreeNode root) {
if (root != null) {
System.out.print(root.val+" ");
preOrderTraverse(root.left);
preOrderTraverse(root.right);
}
}
非递归实现
思路:
对于任意结点。
1、把结点入栈,然后将当前结点置为左孩子。
2、判断结点是否为空,若为空,则取出栈顶结点并出栈,将右孩子置为当前结点;否则重复第一步直到当前结点为空或者栈为空。
public void preOrderTraverse(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pNode = root;
while (pNode != null || stack.size() > 0) {
if (pNode != null) {
System.out.print(pNode.val+" ");
stack.push(pNode);
pNode = pNode.left;
} else {
TreeNode node = stack.pop();
pNode = node.right;
}
}
}
中序遍历
递归实现
public void inOrderTraverse(TreeNode root) {
if (root != null) {
inOrderTraverse(root.left);
System.out.print(root.val+" ");
inOrderTraverse(root.right);
}
}
非递归实现
思路:
1、首先将当前节点root的各个左子节点压入栈
2、然后依次从栈中取数据,进行打印,然后将当前节点置为栈顶的右孩子节点,回到1
3、如此循环直至栈为空
public void inOrderTraversal()
{
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode node=root;
while(node!=null || stack.size()>0)
{
while(node!=null)
{
stack.push(node);
node=node.left;
}
if(stack.size()>0)
{
node=stack.pop();
System.out.print(node.val+" ");
node=node.right;
}
}
}
后序遍历
递归实现
public void postOrderTraverse(TreeNode root) {
if (root != null) {
postOrderTraverse(root.left);
postOrderTraverse(root.right);
System.out.print(root.val+" ");
}
}
非递归实现
思路:
1、首先将当前节点的各个右子节点进行入数据栈,同时将该节点的值压入一个值栈
2、然后依次从数据栈中取数据,将当前节点置为数据栈顶元素的左孩子节点,回到1
3、直至数据栈为空,此时再依次遍历值栈进行打印
public void postOrderTraversal()
{
Stack<TreeNode> stack=new Stack<TreeNode>();
Stack<Integer> valStack=new Stack<Integer>();
TreeNode node=root;
while(node!=null || stack.size()>0)
{
while(node!=null)
{
stack.push(node);
valStack.push(node.val);
node=node.right;
}
node=stack.pop();
node=node.left;
}
while(valStack.size()>0)
{
System.out.print(valStack.pop()+" ");
}
}