当前位置:   article > 正文

【Java数据结构】BST树(二叉搜索树)总结02(前、中、后序遍历,层序遍历)_bst树的层序遍历

bst树的层序遍历

二叉树总结:入口

二叉树的基本操作:

1、插入,删除 操作

2、前、中、后序遍历,层序遍历

3、求BST树高度,求BST树节点个数

4、返回中序遍历第k个节点的值

5、判断一个二叉树是否是BST树,判断一个BST树是否是AVl树

6、BST树的镜像

7、把BST树满足[begin,end]区间的值放在集合中、打印出来

8、判断是否是子树

9、按层打印二叉树

 

1、前序遍历

前序遍历:若树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树,访问顺序:中   左   右

递归:先打印根节点,递归优先进入左子树打印根节点,以此类推

非递归:1操作(让二叉树的左子树依次先打印然后入栈,接着出栈  检查是否有右孩子,如果有则进入右孩子),然后重复1操作。

 

  1. //前序遍历
  2. //递归
  3. public void n_preOrder(){
  4. n_preOrder(this.root);
  5. }
  6. private void n_preOrder(BSTNode root){
  7. if(root==null)
  8. return;
  9. System.out.print(root.getData() +" ");
  10. n_preOrder(root.getLeft());
  11. n_preOrder(root.getRight());
  12. }
  13. //非递归栈
  14. //左子树依次入栈 然后回退入一个右子树,接着右子树的所有左子树再入栈,以此类推。
  15. public void non_PreOrder(){
  16. non_PreOrder(this.root);
  17. }
  18. private void non_PreOrder(BSTNode root){
  19. if(root==null){
  20. return;
  21. }
  22. Stack<BSTNode> st=new Stack<>();
  23. while(!st.isEmpty() || root!=null) {
  24. while (root != null) {
  25. System.out.print(root.getData() + " ");
  26. st.push(root);
  27. root = root.getLeft();
  28. }
  29. if (!st.isEmpty()) {
  30. root = st.peek();
  31. st.pop();
  32. root = root.getRight();
  33. }
  34. }
  35. }

 

2、中序遍历

中序遍历:若树为空,则空操作返回。否则,从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。  访问顺序:左 中 右

 

递归:先进入左孩子,再打印,再进入右孩子,以此类推。

非递归:与前序遍历不同,中序遍历出栈的时候再打印。从根节点开始一直将左孩子入栈,然后出栈并打印,出栈以后找出栈元素是否有右子树,如果存在,将右孩子左子树入栈,以此类推。

  1. //中序遍历
  2. //递归
  3. public void n_miOrder(){
  4. n_miOrder(this.root);
  5. }
  6. private void n_miOrder(BSTNode root){
  7. if(root==null){
  8. return;
  9. }
  10. n_miOrder(root.getLeft());
  11. System.out.print(root.getData() +" ");
  12. n_miOrder(root.getRight());
  13. }
  14. /**
  15. * 非递归中序遍历
  16. * 从根节点开始到左孩子的left一直入栈
  17. * 出栈,并打印 ,如果当前出栈元素的右孩子不为NULL(以及右孩子的左子树不为NULL)就全部入栈,
  18. * 如果为null 继续出栈下一个元素;
  19. */
  20. public void non_miInOder(BSTNode root){
  21. if(root==null){
  22. return;
  23. }
  24. Stack<BSTNode> st=new Stack<BSTNode>();
  25. while(!st.isEmpty() || root!=null) {
  26. while (root != null) {
  27. st.push(root);
  28. root = root.getLeft();
  29. }
  30. root = st.peek();
  31. st.pop();
  32. System.out.print(root.getData() + " ");
  33. root = root.getRight(); //右孩子以及右孩子的左子树都入栈;
  34. }
  35. }

 

3、后序遍历

后序遍历:若树为空,则空操作返回。否则,从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。访问顺序:左右   中

 

递归:先进左子树,再进右子树,再打印。

非递归:从根节点开始将左子树入栈,出栈前判断栈顶元素右子树是否为空,不为空则将出栈的元素重新入栈,再将根节点指向原根节点的右子树。为空就出栈打印栈顶元素。注意出栈之前先把右孩子以及右孩子的左子树都入栈。

  1. // 后序遍历
  2. //递归
  3. public void n_lastOrder(){
  4. n_lastOrder(root);
  5. }
  6. private void n_lastOrder(BSTNode root){
  7. if(root==null){
  8. return;
  9. }
  10. n_lastOrder(root.getLeft());
  11. n_lastOrder(root.getRight());
  12. System.out.print(root.getData() +" ");
  13. }
  14. /**
  15. * 非递归后序
  16. * 从根节点开始往left一直入栈
  17. * 出栈之前先判断当前栈顶元素的右孩子以及右孩子的左子树是否为NULL 不为null时先入栈
  18. * 为NULL时,就出栈并 打印栈顶元素
  19. **/
  20. //LRV 出栈之前先把右孩子以及右孩子的左子树都入栈
  21. public void non_LastOrder(){
  22. if(root==null){
  23. return;
  24. }
  25. Stack<BSTNode> st=new Stack<BSTNode>();
  26. BSTNode tag=null;//记录 是否搜索过此条右子树
  27. while (!st.isEmpty() || root!=null){
  28. while(root!=null){
  29. st.push(root);
  30. root=root.getLeft();
  31. }
  32. root=st.peek();
  33. st.pop();
  34. if(root.getRight()==null || root.getRight()==tag){ //找栈顶值的右孩子
  35. System.out.print(root.getData()+" ");
  36. tag=root;
  37. root=null;
  38. }else{ //有右孩子
  39. st.push(root);
  40. root=root.getRight();
  41. }
  42. }
  43. }

 

 

4、层序遍历

 

非递归:使用队列,先将根节点入队,然后再出队  打印值,再将出队元素的左右孩子入队。再循环出队,以此类推。由于队列是先入先出,所以可以保证先入的节点  先打印,即   一层遍历完了,再遍历下一层。

 

  1. //层序遍历
  2. //非递归队列(出队打印后把左右孩子都入队)
  3. public void levelOrder(){
  4. if(root==null){
  5. return;
  6. }
  7. Queue<BSTNode> qu=new LinkedList<>();
  8. qu.add(root);
  9. while (!qu.isEmpty()){
  10. root=qu.peek();
  11. qu.poll();
  12. System.out.print(root.getData()+" ");
  13. if(root.getLeft()!=null){
  14. qu.add(root.getLeft());
  15. }
  16. if(root.getRight()!=null){
  17. qu.add(root.getRight());
  18. }
  19. }
  20. }
  21. //递归层序遍历
  22. public void LeveOrder(){
  23. int height=n_getHeight();//算BST树高度。
  24. for(int i=0;i<=height;i++){
  25. leve(root,i);
  26. }
  27. System.out.println();
  28. }
  29. private void leve(BSTNode root, int i) {
  30. if(root==null){ //BST不一定是一颗完全树
  31. return;
  32. }
  33. if(i==1) {
  34. System.out.print(root.getData() +" ");
  35. }
  36. leve(root.getLeft(),i-1);
  37. leve(root.getRight(),i-1);
  38. }
  39. //求BST树的高度
  40. public int n_getHeight(){
  41. return n_getHeight(root);
  42. }
  43. private int n_getHeight(BSTNode root){
  44. if(root==null){
  45. return 0;
  46. }
  47. int leftheight= n_getHeight(root.getLeft());
  48. int rightheight= n_getHeight(root.getRight());
  49. return Math.max(leftheight, rightheight)+1;
  50. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/274997
推荐阅读
相关标签
  

闽ICP备14008679号