• 二叉树的递归算法


    二叉树

    二叉树是一种特殊的数据结构,有一个根节点,根节点下面有一左一右两个子节点,每个子节点又有各自的子节点,层层深入成树状。

    二叉树的遍历

    关于二叉树的遍历我只学习了递归遍历,非递归遍历比较复杂还是很理解。

    递归遍历分为先序,中序和后序。用三个字母表示递归遍历可以很好理解:

    D: 访问根节点,L: 遍历根节点的左子树,R:遍历根节点的右子树。

    先序遍历:DLR

    中序遍历:LDR

    后序遍历:LRD

    先序遍历的递归算法

    function preOrder(node) {
    	if (node) {
    		console.log(node.value);
    		preOrder(node.left);
    		preOrder(node.right);
    	}
    }
    

    中序遍历的递归算法

    function inOrder(node) {
    	if (node) {
    		inOrder(node.left);
    		console.log(node.value);
    		inOrder(node.left);
    	}
    }
    

    后序遍历的递归算法

    function postOrder(node) {
    	if (node) {
    		postOrder(node.left);
    		postOrder(node.right);
    		console.log(node.value);
    	}
    }
    

    更详细的二叉树算法可以查看这篇文章

    定时问题

    遇到的一个难题是如何实现间隔一段时间(500ms)改变节点的颜色,这就需要用到setTimeout()这个方法。刚开始的想法是把定时函数写进递归函数里面,让每次递归都执行setTimeout(),但是这个方法行不通,会改变每个节点出现的顺序,而且函数执行结束的时间小于定时时间,导致想要达到的效果一瞬间全部执行完毕,而不是按规定的时间一个一个出现,这个理解可能有点错误,但是没办法达到想要的效果,所以放弃。

    我的方法是把遍历出来的值放进数组里,然后再用数组完成想要做的各种操作。

    function preOrder(node) {
    	if (node) {
    		preOrder(node.left);
    		preOrder(node.right);
    		preList.push(node.value);
    	}
    }
    
    for (let i = 0; i < preList.length; i++) {
    	setTimeout(function() {
    		console.log(preList[i]);  // 这样就可以按顺序每隔一段时间打印出一个数字
    	}, 500 * i);
    }
    

    博客首发地址:https://www.jianshu.com/u/13cd86311525

  • 相关阅读:
    fern没有扫描到任何ap
    kali软件的必须知道的那些事
    我的kali学习计划
    arping 自己
    kali密码破解
    kali目录修改
    我的电脑网络不通了
    收藏链接的正确方法
    maltego的 卡 慢 没反应 的问题解决方法
    git报错 failed: The TLS connection was non-properly terminated.
  • 原文地址:https://www.cnblogs.com/chaohangz/p/6719937.html
Copyright © 2020-2023  润新知