当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- [Python 1-6] Python tutorial 1 -- number
- .NET 大数据量并发解决方案
- Stm32uberide download and install - GPIO basic configuration operation - debug (based on CMSIS DAP debug)
- 技术总监7年总结,如何进行正确的沟通?
- 浅谈单调栈
- Elasticsearch 学习一(基础入门).
- Dev-c++在windows环境下无法debug(调试)的解决方案
- laravel8更新之维护模式改进
- 构建者模式(Builder pattern)
- “他,程序猿,35岁,被劝退”:不要只懂代码,会说话,胜过10倍默默努力
猜你喜欢

Returning to the third place in the world, what did Xiaomi do right?

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

构建者模式(Builder pattern)

我们做了一个医疗版MNIST数据集,发现常见AutoML算法没那么好用

2020-11-05

This year's salary is 35W +! Why is the salary of Internet companies getting higher and higher?

2035 we will build such a country

Do these mistakes in your resume affect your annual salary of one million?

Leancloud changes in October

C + + things: from rice cookers to rockets, C + + is everywhere
随机推荐
新型存算一体芯片诞生,利好人工智能应用~
浅谈,盘点历史上有哪些著名的电脑病毒,80%的人都不知道!
3、 The parameters of the function
Suitable for C / C + + novice learning some projects, do not give me to miss!
Don't release resources in finally, unlock a new pose!
C++的那些事儿:从电饭煲到火箭,C++无处不在
后端程序员必备:分布式事务基础篇
10 common software architecture patterns
The progress bar written in Python is so wonderful~
技术总监7年总结,如何进行正确的沟通?
Share the experience of passing the PMP examination
wanxin finance
Welcome to offer, grade P7, face-to-face sharing, 10000 words long text to take you through the interview process
非常规聚合问题举例
Summary of template engine
Alibaba cloud accelerates its growth and further consolidates its leading edge
The network adapter could not establish the connection
Powershell 使用.Net对象发送邮件
Golang 系统ping程序探测存活主机(任意权限)
基于阿里云日志服务快速打造简版业务监控看板