简单编程题目连载(三)

来源:互联网 发布:批发购物软件 编辑:程序博客网 时间:2024/05/21 10:02

二叉树中如何获取二叉树的层数?

注意这里获取的层数是从1开始算的,不是从0开始的。

直接上代码:

public class Node{    public int value;    public Node left;    public Node right;    public Node(int data){        this.value = data;    }}public void getHeight(Node h,int i){    if(h == null){        return i;    }    return Math.max(getHeight(h.left,i+1),getHeight(h.right,i+1));}

举个例子:

public class Test{    public static void main(String[] args){        Node node1 = new Node(1);        Node node2 = new Node(2);        Node node3 = new Node(3);        Node node4 = new Node(4);        Node node5 = new Node(5);        Node node6 = new Node(6);        Node node7 = new Node(7);        Node node8 = new Node(8);        Node node9 = new Node(9);        Node node10 = new Node(10);        Node node11 = new Node(11);        Node node12 = new Node(12);        Node node13 = new Node(13);        Node node14 = new Node(14);        Node node15 = new Node(15);        Node node16 = new Node(16);        node1.left = node2;        node1.right = node3;        node2.right = node4;        node4.left = node7;        node4.right = node8;        node8.right = node11;        node11.left = node13;        node11.right = node14;        node3.left = node5;        node3.right = node6;        node5.left = node9;        node5.right = node10;        node9.left = node12;        node12.left = node15;        node12.right = node16;        int height = getHeight(node1,0);    }}

上边的二叉树返回的高度为6。

如果获取二叉树每一层上最左和最右节点?

依然以上边的二叉树为例子

创建一个二维的Node类型的数组来存每层最左和最右的节点

Node[][] edgeMap = new Node[height][2];

数组的大小由二叉树的层数来定

然后利用下方的函数即可得到每层的最左和最右节点。

public void setEdgeMap(Node h,int i,Node[][] edgeMap){    if(h == null){        return;    }    edgeMap[i][0] = edgeMap[i][0] == null ? h : edgeMap[i][0];    edgeMap[i][1] = h;    setEdgeMap(h.left,i+1,edgeMap);    setEdgeMap(h.right,i+1,edgeMap);}

这个函数做了一件什么事呢?

二维数组的0位置作为左边,1位置作为右边。

i相当于到达的层数,每到一层,遇到的第一个左节点即为当前层的最左节点,因为该遍历是一直向左延伸的。右节点只要遇到新值就更新。然后递归遍历到每一层。递归基为遇到的节点为空,就返回。

0 0