zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]二叉树问题-统计完全二叉树的节点数

    题意

    计算完全二叉树节点数。

    题解

    • 不使用遍历方法,优化时间复杂度到O(H^2)。
    • 高度为h的满二叉树节点数为2^h-1。
    • 设计递归函数search(Node root,int h,int H),返回当前节点roo为根的完全二叉树的节点数。h代表该节点在的高度,高度从1计算,H代表原始二叉树的高度始终不变。
      • t判断当前节点的右子树的最左边的节点的高度。
        -若和该树的高度一致,则说明左子树为满二叉树,节点数=由上式得到的左子树节点数+本节点数1+递归得到的右子树节点数。
      • 若高度不一致,则说明右子树为满二叉树,节点数=递归得到的左子树节点数+1+上式得到的右子树节点数。
    • 递归时间复杂度的估计:想实际情形,每层的节点只招一个作为根节点算子树节点数,找当前节点右子树的最左节点需要H,故时间复杂度为O(H^2).

    代码

    package Tree;
    
    public class NodeCnt {
    	public static void main(String args[]) {
    		Node root=new Node(10);
    		Node node1=new Node(11);
    		Node node2=new Node(14);
    		Node node3=new Node(11);
    		Node node4=new Node(15);
    		Node node5=new Node(16);
    		root.left=node1;
    		root.right=node2;
    		node1.left=node3;
    		node1.right=node4;
    		node2.left=node5;
    		
    		System.out.print(nodeCnt(root));
    	}
    	public static int nodeCnt(Node root) {
    		if(root==null) {
    			return 0;
    		}
    		return search(root,1,mostLeftNodeH(root,1));
    	}
    	public static int search(Node root,int h,int H) {
    		if(h==H) {
    			return 1;
    		}
    		if(mostLeftNodeH(root.right,h+1)==H) {//
    			return (1<<(H-h))+search(root.right,h+1,H);//
    		}
    		else {
    			return (1<<(H-h-1))+search(root.left,h+1,H);
    		}
    	}
    	public static int mostLeftNodeH(Node root,int level) {//从原始root
    		Node node=root;
    		while(node!=null) {
    			++level;
    			node=node.left;
    		}
    		return level-1;//
    	}
    }
    
    
  • 相关阅读:
    快手视频下载脚本
    ffmpeg 加载双语字幕
    GNU Wget 1.19.1 static built on mingw32
    Struts配置应用2
    Struts配置应用1
    spring-IOC控制反转
    spring-纯pojo切面
    spring面向切面编程的方式实现
    spring-CGLib动态代理
    spring-JDK_AOP动态代理
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11067465.html
Copyright © 2011-2022 走看看