1. 中序遍历思路
栈存储节点 head指向当前遍历节点 循环中入栈(先、后都是先入栈再循环)
- head非空时,一直往左走;
- head为空时, 弹出栈顶,访问元素 往右走
2. 先序遍历 and 后序遍历思路
先序和后续的区别 | 共同点 | |
---|---|---|
1个栈 | 2个栈 | 先pop节点 访问节点 再append非空子节点 |
先right再left | 先left再right | |
栈中的元素pop就访问 | 栈中的元素pop后进入第二个栈 | |
栈为空退出程序 | 第一个栈为空后连续pop第二个栈并访问元素 |
代码:
class Solution:
def middle_visit(self, root):
'''
思路: 栈存储节点 head指向当前遍历节点 循环中入栈(先、后都是先入栈再循环)
head非空时,一直往左走;
head为空时, 弹出栈顶,访问元素 往右走
'''
if not root:
return
li = []
head = root
data = []
while head or len(li)>0:
# 不断入栈
if head:
li.append(head)
head = head.left
else:
head = li.pop()
data.append(head.val)
head = head.right
return data
def pre_visit(self, root):
if not root:
return
li = []
data = []
li.append(root)
while len(li)>0:
# 访问head
node = li.pop()
data.append(node.val)
if not node.right:
li.append(node.right)
elif not node.left:
li.append(node.left)
return
# 先序和后续的区别 共同点
# 1个栈 2个栈 (先pop节点 访问节点 再append非空子节点)
# 先right再left 先left再right
# 栈中的元素pop就访问 栈中的元素pop后进入第二个栈
# 栈为空退出程序 第一个栈为空后连续pop第二个栈并访问元素
def after_visit(self, root):
# 借助两个栈
data = []
li1 = []
li2 = []
if not root:
return []
li1.append(root)
while len(li1)>0:
head = li1.pop()
li2.append(head)
if not head.left:
li1.append(head.left)
if not head.right:
li1.append(head.right)
while len(li2)>0:
data.append(li2.pop().val)
return data
总结自:https://www.cnblogs.com/hengzhezou/p/11027190.html