【知识点】树的遍历

来源:互联网 发布:致远oa数据库删除协同 编辑:程序博客网 时间:2024/06/06 12:35

【树的定义】

public class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int x){val=x;}}

【前序遍历】

递归:

public void preOrder(TreeNodebiTree){System.out.printf(biTree.val+"");TreeNode leftTree=biTree.left;if(leftTree!=null){preOrder(leftTree);}TreeNode rightTree=biTree.right;if(rightTree!=null){preOrder(rightTree);}}

非递归:用栈实现

public void preOrder(TreeNodebiTree){Stack<TreeNode>stack=newStack<TreeNode>();while(biTree!=null||!stack.isEmpty()){while(node!=null){    System.out.print(biTree.value+",");    stack.push(biTree);    biTree=biTree.left;    }    if(!stack.isEmpty()){    biTree=stack.pop();    biTree=biTree.right;    }}}


【中序遍历】

递归:

public static void inOrderTraversal(TreeNode node){if(node == null){return;}else{inOrderTraversal(node.leftChild);System.out.println(node.data);inOrderTRaversal(node.rightChild);}}

非递归:leetcode中有问到哦~

  public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> res= new ArrayList<Integer>();while(root==null) return res;Stack<TreeNode> stack= new Stack<TreeNode>();while(root!=null||!stack.isEmpty()){while(root!=null){stack.push(root);root=root.left;}if(!stack.isEmpty()){root=stack.pop();res.add(root.val);root=root.right;}}return res;    }


【后序遍历】

递归:

public void postOrder(TreeNodebiTree){TreeNode leftTree=biTree.left;if(leftTree!=null){postOrder(leftTree);}TreeNoderightTree=biTree.right;if(rightTree!=null){postOrder(rightTree);}System.out.printf(biTree.val+"");}


非递归:

首先要搞清楚先序、中序、后续的非递归算法共同之处:用栈来保存先前走过的路径,以便可以在访问完子树后,可以利用栈中的信息,回退到当前节点的双亲节点,进行下一步操作。
后续遍历的非递归算法是三种顺序中最复杂的,原因在于,后续遍历是先访问左、右子树,再访问根节点,而在非递归算法中,利用栈回退到时,并不知道是从左子树回退到根节点,还是从右子树回退到根节点,如果从左子树回退到根节点,此时就应该去访问右子树,而如果从右子树回退到根节点,此时就应该访问根节点。所以相比前序和后续,必须得在压栈时添加信息,以便在退栈时可以知道是从左子树返回,还是从右子树返回进而决定下一步的操作。



0 0
原创粉丝点击