当前位置 博文首页 > fareast_mzh的博客:二叉树的直径 diameter-of-binary-tree

    fareast_mzh的博客:二叉树的直径 diameter-of-binary-tree

    作者:[db:作者] 时间:2021-08-13 15:56

    * Tree.h

    //
    // Created by EDZ on 2021/4/2.
    //
    
    #ifndef DIAMETEROFTREE_TREE_H
    #define DIAMETEROFTREE_TREE_H
    #include "deque"
    
    //#ifndef max
    //#define max(a, b) ((a) > (b) ? (a) : (b))
    //#endif
    
    template<class T>
    T max(T a, T b) {
        return a > b ? a : b;
    }
    
    template<class T> class Node {
    public:
        explicit Node(T val) {
            this->val = val;
            this->left = nullptr;
            this->right = nullptr;
        }
        Node *setLeft(Node *node) {this->left = node; return this;}
        Node *setRight(Node *node) {this->right = node; return this;}
        Node *getLeft() {return this->left;}
        Node *getRight() {return this->right;}
        T getValue() {return this->val;}
        static void preOrderTraverse(Node *node, void (*fn)(T)) {
            if (node == nullptr) {
                return;
            }
            fn(node->getValue());
            preOrderTraverse(node->left, fn);
            preOrderTraverse(node->right, fn);
        }
        static int maxDepth(Node *root) {
            if (root == nullptr) {return 0;}
            return 1 + max(maxDepth(root->left), maxDepth(root->right));
        }
        static int diameterOfBinaryTree(Node<T>* root) {
            if (root == nullptr) {return 0;}
            int ans = maxDepth(root->left) + maxDepth(root->right);
            return max(ans, max(diameterOfBinaryTree(root->left), diameterOfBinaryTree(root->right)));
        }
        /**
         * 记录左子树的最大深度或者是右子树的最大深度
         * @param root
         * @param res
         * @return
         */
        static T helper(Node<T> *root, int &res) {
            if (!root) {return 0;}
            int left = helper(root->left, res);
            int right = helper(root->right, res);
            left = root->left ? left + 1 : left;
            right = root->right ? right + 1 : right;
            res = max(res, right + left);
            return max(left, right);
        }
    private:
        Node *left;
        Node *right;
        T val;
    };
    
    template<class T> class Tree {
    public:
        Tree() {this->root = nullptr;}
        explicit Tree(Node<T> *root) {this->root = root;}
        Node<T> *getRoot() {return this->root;}
        void preOrderTraverse(void (*fn)(T)) {
            Node<T>::preOrderTraverse(this->getRoot(), fn);
        }
        int maxDepth() {return Node<T>::maxDepth(this->root);}
        int diameterOfBinaryTree() {
            // return Node<T>::diameterOfBinaryTree(this->root);
            int ans = 0;
            Node<T>::helper(root, ans);
            return ans;
        }
        /**
         * 按层级遍历二叉树
         * https://blog.csdn.net/hansionz/article/details/81947834
         * https://blog.csdn.net/fareast_mzh/article/details/109709882
         * @param fn
         */
        void levelTraverse(void (*fn)(T)) {
            // 树为空,直接返回
            if (this->getRoot() == nullptr) {return;}
            std::deque<Node<T> *> q;
            // 先将根节点入队
            q.push_back(this->getRoot());
            Node<T> *front;
            Node<T> *left, *right;
            while (!q.empty()) {
                // 保存队头并访问, 出队
                front = q.front();
                fn(front->getValue());
                q.pop_front();
                // 将出队节点的左子树根入队
                left = front->getLeft();
                if (left != nullptr) {
                    q.push_back(left);
                }
                // 将出队节点的右子树根入队
                right = front->getRight();
                if (right != nullptr) {
                    q.push_back(right);
                }
            }
        }
    private:
        Node<T> *root;
    };
    
    #endif //DIAMETEROFTREE_TREE_H
    

    * main.cpp

    #include <iostream>
    #include "Tree.h"
    
    int main() {
        auto *node = new Node<int>(1);
        node->setLeft((new Node<int>(2))
                ->setLeft(new Node<int>(4))
                ->setRight(new Node<int>(5)));
        node->setRight((new Node<int>(3)));
    //            ->setLeft((new Node<int>(6))
    //              ->setLeft(new Node<int>(8))
    //              ->setRight(new Node<int>(9)))
    //            ->setRight(new Node<int>(7)));
    
        Tree<int> t = Tree<int>(node);
    
        auto fn = [](int v) {std::cout << v << ",";};
        t.levelTraverse(fn);  // 按层级遍历
        std::cout << "\n";
        t.preOrderTraverse(fn); // 先序遍历
        std::cout <<"\n";
        // 二叉树的深度
        std::cout << "Depth=" << t.maxDepth() << "\n";
        // 二叉树的直径
        std::cout << "Diameter=" << t.diameterOfBinaryTree() <<"\n";
    
        return 0;
    }
    

    * CMakeLists.h

    cmake_minimum_required(VERSION 3.17)
    project(DiameterOfTree)
    
    set(CMAKE_CXX_STANDARD 14)
    
    add_executable(DiameterOfTree main.cpp Tree.h)

    CLion, MinGW配置:

    https://www.jianshu.com/p/1aa989808e15

    MinGW下载:

    https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/

    不要点绿色的按钮 不要点 Online Installer, 在线下载外国的网站速度慢,直接下载?.7z压缩包

    百度网盘:

    下载链接:https://pan.baidu.com/s/1zd5hgyvXJdBxRrj6aq4JKg
    密码:obb8

    或者我的资源:https://download.csdn.net/download/fareast_mzh/16291876

    Clion

    https://download.jetbrains.8686c.com/cpp/CLion-2020.3.3.exe

    如果试用期到了:

    https://blog.csdn.net/fareast_mzh/article/details/109709882

    拖到底部, 执行reset脚本

    ?

    来自leetcode

    https://leetcode-cn.com/problems/diameter-of-binary-tree/

    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {number}
     */
    var diameterOfBinaryTree = function(root) {    
        if (!root) {
            return 1;
        }
        var max = 0;
        var dfs = function(node) {
            if (!node) {return 0;}
            var lh = dfs(node.left);
            var rh = dfs(node.right);
            max = Math.max(max, lh + rh);
            return Math.max(lh, rh) + 1;
        } 
        dfs(root);
        return max;
    };
    

    ?

    cs
    下一篇:没有了