当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- Tight supply! Apple's iPhone 12 power chip capacity exposed
- 关于update操作并发问题
- Elasticsearch 学习一(基础入门).
- Rabbitmq (1) - basic introduction
- How to solve the conflict when JD landed on Devops platform?
- Flink from introduction to Zhenxiang (7. Sink data output file)
- B站stm32视频学习
- STM32CubeIDE下载安装-GPIO基本配置操作-Debug调试(基于CMSIS DAP Debug)
- I used Python to find out all the people who deleted my wechat and deleted them automatically
- Flink从入门到真香(7、Sink数据输出-文件)
猜你喜欢

Powershell 使用.Net对象发送邮件

【Python 1-6】Python教程之——数字

3、 The parameters of the function

分布式文档存储数据库之MongoDB基础入门

Tencent, which is good at to C, how to take advantage of Tencent's cloud market share in these industries?

供货紧张!苹果被曝 iPhone 12 电源芯片产能不足

How to solve the conflict when JD landed on Devops platform?

2035我们将建成这样的国家

Station B STM32 video learning
![[Python 1-6] Python tutorial 1 -- number](/img/3b/00bc81122d330c9d59909994e61027.jpg)
[Python 1-6] Python tutorial 1 -- number
随机推荐
Windows下快递投递柜、寄存柜的软件初探
Tencent, which is good at to C, how to take advantage of Tencent's cloud market share in these industries?
I used Python to find out all the people who deleted my wechat and deleted them automatically
Don't release resources in finally, unlock a new pose!
Improvement of rate limit for laravel8 update
Suitable for C / C + + novice learning some projects, do not give me to miss!
这次,快手终于比抖音'快'了!
On DSA of OpenGL
Builder pattern
Eight ways to optimize if else code
Essential for back-end programmers: distributed transaction Basics
DeepMind 最新论文解读:首次提出离散概率树中的因果推理算法
关于adb连接手机offline的问题解决
Flink from introduction to Zhenxiang (7. Sink data output file)
Examples of unconventional aggregation
别再在finally里面释放资源了,解锁个新姿势!
阿里云视频云技术专家 LVS 演讲全文:《“云端一体”的智能媒体生产制作演进之路》
On the software of express delivery cabinet and deposit cabinet under Windows
On monotonous stack
Elasticsearch 学习一(基础入门).