当前位置:网站首页>Application of four ergodic square of binary tree
Application of four ergodic square of binary tree
2020-11-08 15:22:00 【osc_03803522】
Preface
In the last chapter we started with 0
To 1
The implementation of a binary search tree , And understand the characteristics and basic operation of binary search tree , This chapter introduces more about binary trees , That's tree traversal , Access to each node of the tree . It mainly includes preorder traversal 、 In the sequence traversal 、 After the sequence traversal 、 Sequence traversal , The first three are also called depth first traversal (DFS)
, The last sequence traversal is also called breadth first traversal (BFS)
, Understand the differences between these four traversal methods , When we encounter the tree related algorithm problem again , And you can be more comfortable . It's not just a binary search tree , The idea of traversal also applies to multitree .
Depth-first traversal (DFS)
Depth first, as the name suggests , Start with the depth of the tree , That is, visit one of the subtrees first , And then visit another subtree . The depth priority of the tree is divided into the front / in / After the sequence traversal , The only difference between them is when accessing a specific node , They are different in order . Depth first is usually implemented recursively , Because it's easy to understand , Of course, you can also use traversal to implement , But that will increase the complexity of the code and the semantics of the code .(LeetCode The non recursive implementation of up and down traversal is difficult )
The former sequence traversal
In other words, access the node of the tree from the front , First post the code , Add the method of preorder traversal to the binary search tree implemented in the previous chapter :
Use one prev
Variables cache the last visited node , Each time, let the current access node value minus the previous node value , Because it's a middle order traversal , So the value of the current node must be greater than that of the previous node , Go through the whole tree , Return the minimum value of subtraction .
After the sequence traversal
Just change the location of the access node , Visit the left subtree first , Visit the right subtree , Finally, visit its own root node , Post code :
class BST {
constructor() {
this.root = null // The root node
}
...
postorder(fn) { // After the sequence traversal
const _helper = node => {
if (!node) {
return
}
_helper(node.left) // First visit the left child
_helper(node.right) // And then interview the right child
fn(node.val) // Finally, the root node is accessed
}
_helper(root)
}
}
First visit the left subtree , And then the right subtree , Finally, there is the node itself , The order of access is as follows :
Postorder traversal applications - 563- The slope of the binary tree
Given a binary tree , Calculate the slope of the whole tree .
The slope of a tree node is defined as , The absolute value of the difference between the sum of the nodes of the left subtree and the sum of the nodes of the right subtree . The slope of the empty node is 0.
The slope of the whole tree is the sum of the slopes of all its nodes .
In short, the slope of each node is equal to the absolute difference between the sum of its left and right subtrees , So the slope of the leaf node is 0
, Because the left and right children are empty nodes , Back to you 0-0
Value . If we disassemble the subproblem , It can be understood that the slope of the whole tree is the sum of the slopes of its left and right sub trees , Therefore, it is necessary to calculate the slope of the left and right children before calculating the slope of the current node , Post order traversal is very suitable for .
The solution code is as follows :
var findTilt = function (root) {
let tilt = 0
const _helper = (node) => {
if (!node) {
return 0 // The slope of leaf node is 0
}
const l = _helper(node.left) // First find the sum of the left subtree
const r = _helper(node.right) // Then find the sum of the right subtree
tilt += Math.abs(l - r) // The slope of the current node is equal to the absolute difference between the sum of the left and right subtrees
return l + r + node.val // Return to the subtree and
}
_helper(root)
return tilt
};
Depth-first traversal (DFS) Advanced application
The above three algorithms , The front of the tree is shown separately / in / The practical application of postorder traversal , That's not enough . Some algorithmic problems can not be solved by the conventional traversal method , At this time, we need to deeply understand the tree's (DFS)
After traversing the properties , Make extra flexible processing to solve .
Anti normal ordinal traversal - 538- Convert binary search tree to accumulation tree
Given a binary search tree , Turn it into an accumulation tree , So that the value of each node is the sum of the original node value plus all nodes greater than it .
The topic is not easy to understand , But as you can see from the example of the transformation , Start with the rightmost leaf node of the right subtree , Add the node values in pairs , Finally, the whole tree is accumulated from right to left . If you think of this binary search tree as an array [7,10,12,15,22,26,37]
, Then its operation is to add the array from back to front and cover the previous value . For trees , We need to do an unconventional middle order traversal , First, traverse the right subtree , Then traverse the root node , Finally, traverse the left subtree , That is, a descending traversal .
var convertBST = function (root) {
let sum = 0
const _helper = (node) => {
if (!node) {
return null
}
_helper(node.right) // First traverse the right subtree
node.val += sum // After the right subtree to the bottom, the values are accumulated and covered one by one
sum = node.val // It records the value of the last node that was covered
_helper(node.left) // Finally, traverse the left subtree
}
_helper(root)
return root // Returns a new cumulative tree
};
Preorder and postorder traversal - 257- All paths of binary tree
Given a binary tree , Return all paths from the root node to the leaf node .
The requirement of the title is from the root node to the leaf node , So record the current node of each step , The order of preorder traversal can record the entire path from root to leaf node . The interesting thing about this problem is that when the preorder traversal returns , The last leaf node needs to be removed from the path , Re add another node path value , So it can be in the order of post traversal , Like a greedy snake, you eat the paths you have visited . Some people take this solution to a very powerful, called backtracking . The code is as follows :
版权声明
本文为[osc_03803522]所创,转载请带上原文链接,感谢
边栏推荐
- Flink从入门到真香(7、Sink数据输出-文件)
- Golang system ping program to detect the surviving host (any permission)
- 阿里撕下电商标签
- Python基础语法
- Alibaba cloud accelerates its growth and further consolidates its leading edge
- The network adapter could not establish the connection
- Rust: performance test criteria Library
- 10 common software architecture patterns
- Golang 系统ping程序探测存活主机(任意权限)
- Tight supply! Apple's iPhone 12 power chip capacity exposed
猜你喜欢
软件开发中如何与人协作? | 每日趣闻
Improvement of rate limit for laravel8 update
Dev-c++在windows环境下无法debug(调试)的解决方案
laravel8更新之维护模式改进
Don't release resources in finally, unlock a new pose!
后端程序员必备:分布式事务基础篇
Xiaoqingtai officially set foot on the third day of no return
Alibaba cloud accelerates its growth and further consolidates its leading edge
用 Python 写出来的进度条,竟如此美妙~
Station B STM32 video learning
随机推荐
This time Kwai tiktok is faster than shaking.
On monotonous stack
2035 we will build such a country
学习记录并且简单分析
我用 Python 找出了删除我微信的所有人并将他们自动化删除了
Introduction to mongodb foundation of distributed document storage database
Share the experience of passing the PMP examination
Workers, workers soul, draw lifelong members, become a person!
Flink从入门到真香(3、从集合和文件中读取数据)
This year's salary is 35W +! Why is the salary of Internet companies getting higher and higher?
区块链周报:数字货币发展写入十四五规划;拜登邀请MIT数字货币计划高级顾问加入总统过渡团队;委内瑞拉推出国营加密交易所
小米、OPPO在欧洲市场继续飙涨,小米更是直逼苹果
Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)
关于adb连接手机offline的问题解决
进入互联网得知道的必备法律法规有哪些?
Leancloud changes in October
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水
优化if-else代码的八种方案
应届生年薪35w+ !倒挂老员工,互联网大厂薪资为何越来越高?
Tight supply! Apple's iPhone 12 power chip capacity exposed