树的前序中序后序层序遍历

来源:互联网 发布:ubuntu 14 拼音输入法 编辑:程序博客网 时间:2024/04/29 01:34
总结:树的相关遍历算法,非递归1、层序遍历,使用队列来实现;2、前序和中序遍历,用栈来实现;3、后序遍历思想与2相同,出栈时需要判断是否为上次出栈的左右孩子即可。
/*树的结构体定义*class treeNode{*int data;*treeNode left;*treeNode right;*treeNode(int n){this.data = n;}**}*/        //创建树treeNode createTree(int n){int i = 1;treeNode root = new treeNode(i);Queue<treeNode> result = new LinkedList<treeNode>();result.add(root);while(i < n){result.peek().left = new treeNode(++i);result.add(result.peek().left);if(i == n)return root;result.peek().right = new treeNode(++i);result.add(result.peek().right);result.remove();}return root;}//层序遍历void levelorderTravel(treeNode root){if(root == null)return;Queue<treeNode> res = new LinkedList<treeNode>();res.add(root);while(!res.isEmpty()){if(root.left != null)res.add(root.left);if(root.right != null)res.add(root.right);root = res.remove();System.out.println(root.data);}}       //前序遍历void preorderTravel(treeNode root){if(null == root) return;Stack<treeNode> pre = new Stack<treeNode>();treeNode temp;while( !pre.isEmpty() || root != null){while(root != null){pre.push(root);System.out.println(root.data);    root = root.left;}temp = pre.pop();root = temp.right;}}        //中序遍历void inorderTravel(treeNode root){if(null == root) return;Stack<treeNode> pre = new Stack<treeNode>();treeNode temp;while( !pre.isEmpty() || root != null){while(root != null){pre.push(root);    root = root.left;}temp = pre.pop();System.out.println(temp.data);root = temp.right;}}        //后序遍历void postorderTravel(treeNode root){if(null == root) return;Stack<treeNode> pre = new Stack<treeNode>();treeNode temp, temp_pre;temp_pre = null;while( !pre.isEmpty() || root != null){while(root != null){pre.push(root);    root = root.left;}temp = pre.peek();if(temp.right == null || temp_pre == temp.right){    temp = pre.pop();     System.out.println(temp.data);     } if(temp_pre != temp.right)    root = temp.right;temp_pre = temp;}}

0 0
原创粉丝点击