按层遍历二叉查找树

《算法》中二叉查找树一节的习题:按层遍历二叉查找树。

可以使用队列来管理二叉查找树中的节点,节点按照如下方法入队出队:

  • 节点x入队
  • 当队列不为空时使用队列的第一个元素first
  • 如果节点first.left不为空则将fisrt.left入队
  • 如果节点first.right不为空则将first.right入队
  • 将first节点出队
/**
 * Created by elvalad on 2014/12/5.
 * 按层遍历二叉查找树
 */
import java.util.Iterator;
import java.util.LinkedList;

public class PrintBST<Key extends Comparable<Key>, Value> {
    private Node root;  /* 根节点 */
    private int N;      /* 节点数 */
    private class Node {
        Key key;        /* 键 */
        Value val;      /* 值 */
        Node left;      /* 左子树 */
        Node right;     /* 右子树 */
        Node(Key key, Value val) {
            this.key = key;
            this.val = val;
        }
    }

    public void put(Key key, Value val) {
        root  = put(root, key, val);
        N++;
    }

    private Node put(Node x, Key key, Value val) {
        if (x == null) {
            return new Node(key, val);
        }

        int cmp = key.compareTo(x.key);
        if (cmp < 0) {
            x.left = put(x.left, key, val);
        } else if (cmp > 0) {
            x.right = put(x.right, key, val);
        } else {
            x.val = val;
        }

        return x;
    }

    public int height(Node x) {
        if (x == null)
            return 0;
        int lh = height(x.left);
        int rh = height(x.right);

        return (lh > rh) ? (lh + 1) : (rh + 1);
    }

    /* 使用队列将每个节点按一定的顺序入队出队,遍历队列中的元素即可 */
    public void printBST(Node x) {
        if (x == null)
            return;

        LinkedList<Node> lln = new LinkedList<Node>();
        lln.add(x);
        while (!lln.isEmpty()) {
            Node first  = lln.getFirst();
            System.out.println(first.key);
            if (first.left != null) {
                lln.add(first.left);
            }
            if (first.right != null) {
                lln.add(first.right);
            }
            lln.remove();
        }
    }

    public static void main(String[] args) {
        PrintBST<String, Integer> pbst = new PrintBST<String, Integer>();
        pbst.put("DDDD", 4);
        pbst.put("CCC", 3);
        pbst.put("A", 1);
        pbst.put("BB", 2);
        pbst.put("FFFFFF", 6);
        pbst.put("EEEEE", 5);

        pbst.printBST(pbst.root);
    }
}
时间: 2024-08-06 16:05:49

按层遍历二叉查找树的相关文章

二叉树的按层遍历

常见的前序.中序.后序都很常见,最近用到了按层遍历,记录一下: 思路:用一个队列来作为辅助空间.依次存储头结点,左节点和右节点.每次循环输出节点的值,直到队列为空这样一来就利用了队列先进先出的性质实现了非递归按层遍历二叉树. 具体实现: void levelOrderTraverse(const BiTree& t) { queue<BiTree> q; BiTree p = NULL; if(t) { q.push(t); } while(!q.empty()) { p = q.fr

二叉树(6)----按层遍历二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.按层遍历二叉树 第一步:需要借助队列,首先将根节点pRoot入队:

二叉树的建树,按层遍历,结点总数,页结点以及深度

建立一颗二叉树: #include "handsomecui.h" typedef struct Node{ char data; Node *left, *right; }Node, *Tree; Tree build(){ char c; SI(c); if(c == '#'){ return NULL; } else{ Node *root = new Node; root->data = c; root->left = build(); root->right

中序遍历-----二叉查找树的遍历(迭代版,不使用栈或者队列)

二叉查找树(Binary Search Tree)的遍历的方法有很多,通常使用的是递归的遍历,其便于理解,但是使用递归的话会造成程序运行的空间浪费,效率并不高.为此可以使用一个栈来模拟递归的过程,实现迭代版的二叉查找树的遍历.但是会使用到额外的存储空间,虽说在运行效率上比递归版的有所提高,但是额外的存储空间还是一定的浪费.但是如何减少额外的存储空间呢?我们知道二叉查找树是可以转换为一个双向环形链表(二叉查找树与双向环形链表的转化),而链表的遍历是不需要额外的空间的,因此我们可以考虑通过充分利用树

C语言实现最大二叉树并按层遍历

题目:给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最大值右边部分构造出的最大二叉树. 通过给定的数组构建最大二叉树,并且输出这个树的根节点. Example 1: 输入: [3,2,1,6,0,5] 输入: 返回下面这棵树的根节点: 6 / 3 5 \ / 2 0 1 分析:(1)通过审题可知通过先序创建二叉树进行创建,即创建根节点,左子树,右子数. 所以选择递归的

数据结构——二叉树遍历之“层遍历”

系列文章:数据结构与算法系列——从菜鸟到入门 层次遍历 二叉树的层次遍历是指,从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中从左至右依次遍历. 设置一个队列,将二叉树的根结点放入队列中. 将队列中的头结点出队,赋值给临时变量 temp,同时输出打印 temp.val. 判断 temp 是否有左结点和右结点,若有,分别将左.右结点放入队列中. 重复步骤 2~3,直至队列为空,表示二叉树的层次遍历结束. private static void cengci(TreeNode root)

二叉树基础——前序遍历、中序遍历、后序遍历、按层遍历

转载请注明原文地址: 一:树的结点 一般默认树的结点由:结点值.左儿子.右儿子,构造函数组成. class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int i){ this.value=i; } } 二:二叉树的遍历实现--递归和非递归 1:递归实现==按照遍历方式(前.中.后)对左.根.右的访问顺序去 打印结点值.递归左儿子.递归右儿子 public void preorder(TreeNode r

LeetCode:Binary Tree Level Order Traversal II (按层遍历)

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its bottom-up level order trave

二叉树6----一层二叉树的遍历

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.按层遍历二叉树 第一步:须要借助队列,首先将根节点pRoot入队: