解题思路

这是一道二叉树题目,主要思路如下:

  1. 问题分析:

    • 给定一棵二叉树的父子关系
    • 节点编号从0到n-1
    • 根节点为0号节点
    • 求树的高度
  2. 解决方案:

    • 构建二叉树
    • 递归计算高度
    • 左右子树取最大值加1
  3. 实现细节:

    • 使用类封装树节点
    • 前序遍历寻找父节点
    • 递归计算树高

代码

#include <iostream>
using namespace std;

// 树节点类
class Node {
    int data;
    Node *leftChild;
    Node *rightChild;
public:
    Node() { leftChild = rightChild = NULL; }
    
    void setLeft(int d) {
        leftChild = new Node();
        leftChild->data = d;
    }
    
    void setRight(int d) {
        rightChild = new Node();
        rightChild->data = d;
    }
    
    void setData(int d) { data = d; }
    int getData() { return data; }
    Node* getLeftChild() { return leftChild; }
    Node* getRightChild() { return rightChild; }
    bool leftEmpty() { return leftChild == NULL; }
    bool rightEmpty() { return rightChild == NULL; }
};

// 二叉树类
class Tree {
    Node *root;
    
    // 递归删除节点
    void del(Node *r) {
        if(r == NULL) return;
        del(r->getLeftChild());
        del(r->getRightChild());
        delete r;
    }
    
    // 计算高度
    int height(Node* r) {
        if(r == NULL) return 0;
        if(r->leftEmpty() && r->rightEmpty()) return 1;
        int left = height(r->getLeftChild());
        int right = height(r->getRightChild());
        return max(left, right) + 1;
    }
    
    // 前序遍历寻找父节点
    bool preOrder(Node *r, const int &p, const int &c) {
        if(r == NULL) return false;
        if(r->getData() == p) {
            if(r->leftEmpty()) {
                r->setLeft(c);
                return true;
            }
            if(r->rightEmpty()) {
                r->setRight(c);
                return true;
            }
            return false;
        }
        return preOrder(r->getLeftChild(), p, c) || 
               preOrder(r->getRightChild(), p, c);
    }
    
public:
    Tree() { root = NULL; }
    ~Tree() { if(root != NULL) del(root); }
    
    // 连接节点
    void connect(const int &p, const int &c) {
        if(root == NULL) {
            root = new Node();
            root->setData(p);
            root->setLeft(c);
        } else {
            preOrder(root, p, c);
        }
    }
    
    // 获取树高
    int getHeight() {
        return height(root);
    }
};

int main() {
    int n;
    cin >> n;
    
    Tree tree;
    for(int i = 0; i < n-1; i++) {
        int parent, child;
        cin >> parent >> child;
        tree.connect(parent, child);
    }
    
    cout << tree.getHeight() << endl;
    return 0;
}
import java.util.*;

class Node {
    int data;
    Node left, right;
    
    Node(int data) {
        this.data = data;
        left = right = null;
    }
}

class Tree {
    Node root;
    
    Tree() {
        root = null;
    }
    
    void connect(int parent, int child) {
        if(root == null) {
            root = new Node(parent);
            root.left = new Node(child);
            return;
        }
        addNode(root, parent, child);
    }
    
    boolean addNode(Node node, int parent, int child) {
        if(node == null) return false;
        if(node.data == parent) {
            if(node.left == null) {
                node.left = new Node(child);
                return true;
            }
            if(node.right == null) {
                node.right = new Node(child);
                return true;
            }
            return false;
        }
        return addNode(node.left, parent, child) || 
               addNode(node.right, parent, child);
    }
    
    int getHeight() {
        return height(root);
    }
    
    int height(Node node) {
        if(node == null) return 0;
        return Math.max(height(node.left), height(node.right)) + 1;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        Tree tree = new Tree();
        for(int i = 0; i < n-1; i++) {
            int parent = sc.nextInt();
            int child = sc.nextInt();
            tree.connect(parent, child);
        }
        
        System.out.println(tree.getHeight());
    }
}
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class Tree:
    def __init__(self):
        self.root = None
    
    def connect(self, parent, child):
        if not self.root:
            self.root = Node(parent)
            self.root.left = Node(child)
            return
        self._add_node(self.root, parent, child)
    
    def _add_node(self, node, parent, child):
        if not node:
            return False
        if node.data == parent:
            if not node.left:
                node.left = Node(child)
                return True
            if not node.right:
                node.right = Node(child)
                return True
            return False
        return (self._add_node(node.left, parent, child) or 
                self._add_node(node.right, parent, child))
    
    def get_height(self):
        return self._height(self.root)
    
    def _height(self, node):
        if not node:
            return 0
        return max(self._height(node.left), 
                  self._height(node.right)) + 1

def main():
    n = int(input())
    tree = Tree()
    
    for _ in range(n-1):
        parent, child = map(int, input().split())
        tree.connect(parent, child)
    
    print(tree.get_height())

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:树的遍历 + 递归
  • 时间复杂度: - 为节点数
  • 空间复杂度: - 为树的高度,递归栈空间