树的各种遍历

匿名 (未验证) 提交于 2019-12-02 23:42:01

1. 前序遍历

(1)递归写法

    public List<Integer> preorderTraversal(TreeNode root) {         List<Integer> re = new ArrayList<Integer>();         pre(root,re);         return re;     }     private void pre(TreeNode root,List<Integer> re){         if(null == root){             return;         }         re.add(root.val);         pre(root.left,re);         pre(root.right,re);     }

(2)非递归写法

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

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

2.中序遍历

    public List<Integer> inorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         inorderT(root,res);         return res;      }     private void inorderT(TreeNode root,List list){         if(null!=root){             inorderT(root.left,list);             list.add(root.val);             inorderT(root.right,list);         }     }

(2)非递归

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

3.后序遍历

    public List<Integer> postorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         post(root,res);         return res;     }     private void post(TreeNode root,List<Integer> re){         if(null==root){             return;         }         post(root.left,re);         post(root.right,re);         re.add(root.val);     }

(2)非递归

    public List<Integer> postorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         Stack<TreeNode> stack = new Stack<TreeNode>();         TreeNode cur =root;         TreeNode prior = null;          while(null!=cur){             stack.push(cur);             cur = cur.left;         }         while(!stack.isEmpty()){                  cur = stack.peek();//取得结点但不让它出栈             if(cur.right == null || cur.right == prior){//判断该节点的右结点是否访问过                 stack.pop();                 res.add(cur.val);                 prior = cur;                            }             else{                 cur = cur.right;                 while(null!= cur){                     stack.push(cur);                     cur = cur.left;                 }             }                          }         return res;     }

    public List<Integer> postorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         Stack<TreeNode> stack = new Stack<TreeNode>();         TreeNode cur =root;         TreeNode prior = null;         while(null!= cur||!stack.isEmpty()){             while(null!=cur){                 stack.push(cur);                 cur = cur.left;             }             cur = stack.peek();//取得结点但不让它出栈             if(cur.right == null || cur.right == prior){//判断该节点的右结点是否访问过                 stack.pop();                 res.add(cur.val);                 prior = cur;                 cur = null;             }             else{                 cur = cur.right;             }                          }         return res;     }

4. 层次遍历

    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {//树 my         Queue<TreeNode> queue = new LinkedList<TreeNode>();         ArrayList<Integer> result = new ArrayList<Integer>();         TreeNode node =root;         while(null != node){             result.add(node.val);             if(null != node.left){                 queue.add(node.left);             }             if(null != node.right){                 queue.add(node.right);             }             node = queue.poll();         }          return result;     }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!