• 树的遍历


    树的遍历方式一般来说两类,深度优先搜索(DFS)和广度优先搜索(BFS)

    • DFS:先序遍历、中序遍历、后序遍历
    • BFS:层序遍历

    先序遍历

    输出顺序: 当前节点 左子树 右子树

    中序遍历

    输出顺序: 左子树 当前节点 右子树

    后序遍历

    输出顺序: 左子树 右子树 当前节点

    树的后序遍历/深度优先搜索常利用 递归 实现。

    举个栗子,判断树是不是平衡树:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/

        int recur(TreeNode* root){
            if(root == NULL) return 0;
            int left = recur(root->left);
            if(left==-1) return -1;
            int right = recur(root->right);
            if(right==-1) return -1;
            if(abs(left-right)<=1){
                return max(left,right)+1;
            }else{
                return -1;
            }
        }
        bool isBalanced(TreeNode* root) {
            //后序遍历+ 减枝
            return recur(root) != -1;
        }

    层序遍历(BFS)

    树的层序遍历 / 广度优先搜索往往利用 队列 实现

    思路一次把树的一层内有效的节点加入队列中!

    举个例子:

    获取树的深度,用DFS可以简单化代码,很快啊,当然还可以用BFS:

    int maxDepth(TreeNode* root) {
    
            int res = 0;
            if (!root) {
                return 0;
            }
    
            queue<TreeNode*> q_save_one_layer_node;
            q_save_one_layer_node.push(root);
            while (q_save_one_layer_node.size()) {
                vector<int> tmp_val;
                for (int i = q_save_one_layer_node.size(); i > 0; i--) {   
                    TreeNode* node = q_save_one_layer_node.front();
                    q_save_one_layer_node.pop();
                    tmp_val.push_back(node->val);
                    if (node->left != NULL) {
                        q_save_one_layer_node.push(node->left);
                    }
                    if (node->right) {
                        q_save_one_layer_node.push(node->right);
                    }
                }
    
                res+=1;
            }
    
            return res;
    }
    def maxDepth(self, root: TreeNode) -> int:
        
        #  DFS 后序遍历 
        #if not root: return 0
        #return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
    
    
    
        # BFS 
        if not root:return 0
        queue,res = [root],0
        while queue:
            tmp = []  #因为要把一层的队列对给加入队列中遍历 所以用队列 
            for node in queue: # 上一层出队
                if node.left: tmp.append(node.left) #下一层入队
                if node.right: tmp.append(node.right) #下一层入队
            queue = tmp #上一层出队下一层入队
            res+=1
        return res
    python代码获取树的深度
  • 相关阅读:
    LaTeX中表格多行显示的最简单设置方法
    获取Google音乐的具体信息(方便对Google音乐批量下载)
    移动硬盘提示格式化解决的方法,未正确删除导致不能读取文件提示格式化解决方式
    Android Service 服务(一)—— Service
    华为C8816电信版ROOT过程
    Linux crontab 命令格式与具体样例
    Python用subprocess的Popen来调用系统命令
    我的EJB学习历程
    接口和逻辑--多进程或单一进程
    uva 11354
  • 原文地址:https://www.cnblogs.com/PiaYie/p/15414452.html
Copyright © 2020-2023  润新知