求树的高度

1.进行合法性判断,也是递归结束的条件 
2.递归求出左子树的高度 
3.递归求出右子树的高度 
4.比较左右两边高度大小,选择大的那个加上“根”节点,这里的根是相对于每一个子树/节点的。 
5.返回最后的高度


int Depth(BiTNode * T)
{
    int ret = 0;
    int dep_left = 0, dep_right = 0;
    if (T == NULL)
    {
        ret = 0;
        return ret;
    }

    dep_left = Depth(T->lchild);
    dep_right = Depth(T->rchild);

    ret = 1 + (dep_left>dep_right?dep_left:dep_right);

    return ret;
}




这是在阿里面试的一道题,刚开始感觉不是很难。于是按查找最大值和最小值的方法计算二叉树的深度。结果发现这俩个根本不是一回事。即使你不断遍历左子树,找到了最小

值,但是其最小值节点依然可能会有右子树,这样深度也就会不断增加。也就是说最大值对应的节点并不等同于右子树的深度,最小值对应的节点并不等同于左子树的深度。

面试结果也就可想而知了。

其实拿到这道题,首先想到的应该是采用递归算法。递归算法就得明确两点:

1、基准情形:空树返回-1;

2、递归形式:若不是空树,比较它的左子树深度和右子树深度,返回较大深度值加1,即:return (rightdep>leftdep) ? rightdep+1 : leftdep+1;

编程示例如下:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #define N 10  
  4.   
  5. typedef struct BinTreeNode  
  6. {  
  7.     int data;  
  8.     struct BinTreeNode *left;  
  9.     struct BinTreeNode *right;  
  10. }BinTreeNode,*BinTree;  
  11.   
  12. BinTree insert(BinTree T,int data);//二叉树节点的添加  
  13. int TreeDepth(BinTree T);//返回树的深度(高度)  
  14.   
  15. int main()  
  16. {  
  17.     int i=0;  
  18.     int data[N]= {20, 15 ,10, 12, 18, 25, 30,16,17,18};  
  19.     BinTreeNode *root=NULL;  
  20.     int Depth=0;  
  21.   
  22.     for(i=0;i<N;i++)  
  23.     {  
  24.         root=insert(root,data[i]);  
  25.     }  
  26.   
  27.     Depth=TreeDepth(root);  
  28.     printf("\nTree Depth is %d.\n",Depth);  
  29.     free(root);  
  30.     return 0;  
  31. }  
  32. //注意理解递归  
  33. int TreeDepth(BinTree T)  
  34. {  
  35.      int rightdep=0;  
  36.      int leftdep=0;  
  37.   
  38.     if(T==NULL)  
  39.         return -1;  
  40.   
  41.     if(T->left!=NULL)  
  42.         leftdep=TreeDepth(T->left);  
  43.     else  
  44.         leftdep=-1;  
  45.   
  46.     if(T->right!=NULL)  
  47.         rightdep=TreeDepth(T->right);  
  48.     else  
  49.         rightdep=-1;  
  50.   
  51.     return (rightdep>leftdep) ? rightdep+1 : leftdep+1;  
  52. }  
  53.   
  54. BinTree insert(BinTree T,int data)  
  55. {  
  56.     if(T==NULL)  
  57.     {  
  58.         T=malloc(sizeof(BinTreeNode));  
  59.         if(T==NULL)  
  60.             printf("Out of space!\n");  
  61.         else  
  62.         {  
  63.             T->data=data;  
  64.             T->left=NULL;  
  65.             T->right=NULL;  
  66.         }  
  67.     }  
  68.     else  
  69.     {  
  70.         if(data<T->data)  
  71.             T->left=insert(T->left,data);  
  72.         else  
  73.             T->right=insert(T->right,data);  
  74.     }  
  75.     return T;  
  76. }  

链式存储二叉树的构建可以使用链表来实现,每个节点包含左右子节点的指针。以下是实现查找、求树高度、中序遍历、先遍历、后序遍历和层序遍历的程序: ```python class Node: def __init__(self, data): self.data = data self.left = None self.right = None class BinaryTree: def __init__(self): self.root = None def insert(self, data): node = Node(data) if self.root is None: self.root = node else: queue = [self.root] while queue: curr = queue.pop(0) if curr.left is None: curr.left = node break elif curr.right is None: curr.right = node break else: queue.append(curr.left) queue.append(curr.right) def search(self, data): if self.root is None: return False else: queue = [self.root] while queue: curr = queue.pop(0) if curr.data == data: return True if curr.left is not None: queue.append(curr.left) if curr.right is not None: queue.append(curr.right) return False def height(self): if self.root is None: return 0 else: queue = [self.root] height = 0 while True: level_size = len(queue) if level_size == 0: return height height += 1 while level_size > 0: curr = queue.pop(0) if curr.left is not None: queue.append(curr.left) if curr.right is not None: queue.append(curr.right) level_size -= 1 def inorder(self, node): if node is not None: self.inorder(node.left) print(node.data, end=' ') self.inorder(node.right) def preorder(self, node): if node is not None: print(node.data, end=' ') self.preorder(node.left) self.preorder(node.right) def postorder(self, node): if node is not None: self.postorder(node.left) self.postorder(node.right) print(node.data, end=' ') def levelorder(self): if self.root is None: return queue = [self.root] while queue: curr = queue.pop(0) print(curr.data, end=' ') if curr.left is not None: queue.append(curr.left) if curr.right is not None: queue.append(curr.right) # 测试代码 tree = BinaryTree() tree.insert(1) tree.insert(2) tree.insert(3) tree.insert(4) tree.insert(5) tree.insert(6) tree.insert(7) print(tree.search(5)) # True print(tree.search(8)) # False print(tree.height()) # 3 tree.inorder(tree.root) # 4 2 5 1 6 3 7 print() tree.preorder(tree.root) # 1 2 4 5 3 6 7 print() tree.postorder(tree.root) # 4 5 2 6 7 3 1 print() tree.levelorder() # 1 2 3 4 5 6 7 print() ``` 时间复杂度: - 插入节点:O(n),其中 n 为节点数,最坏情况下需要遍历所有节点。 - 查找节点:O(n),最坏情况下需要遍历所有节点。 - 求树高度:O(n),最坏情况下需要遍历所有节点。 - 中序遍历、先序遍历、后序遍历:O(n),需要遍历所有节点。 - 层序遍历:O(n),需要遍历所有节点。 空间复杂度: - 插入节点、查找节点、求树高度、中序遍历、先序遍历、后序遍历、层序遍历:O(n),需要存储所有节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值