简单编程题目连载(三)
2017-01-13 16:59
204 查看
二叉树中如何获取二叉树的层数?
注意这里获取的层数是从1开始算的,不是从0开始的。
直接上代码:
举个例子:
上边的二叉树返回的高度为6。
如果获取二叉树每一层上最左和最右节点?
依然以上边的二叉树为例子
创建一个二维的Node类型的数组来存每层最左和最右的节点
Node[][] edgeMap = new Node[height][2];
数组的大小由二叉树的层数来定
然后利用下方的函数即可得到每层的最左和最右节点。
这个函数做了一件什么事呢?
二维数组的0位置作为左边,1位置作为右边。
i相当于到达的层数,每到一层,遇到的第一个左节点即为当前层的最左节点,因为该遍历是一直向左延伸的。右节点只要遇到新值就更新。然后递归遍历到每一层。递归基为遇到的节点为空,就返回。
注意这里获取的层数是从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相当于到达的层数,每到一层,遇到的第一个左节点即为当前层的最左节点,因为该遍历是一直向左延伸的。右节点只要遇到新值就更新。然后递归遍历到每一层。递归基为遇到的节点为空,就返回。