Python已知后序遍历和中序遍历,求先序遍历

步骤一:树的构建

字典

python 复制代码
def createTree(arr1,arr2,tree):
    if len(arr1)==0 and len(arr2)==0 :return
    root = len(arr1)-1
    # print(arr1[root],root)
    flag = arr2.index(arr1[root])
    # print(flag)
    len_right = len(arr2)-flag-1
    len_left = flag
    if len(arr2[:flag])>=1:
        lchild = arr1[flag-1]
    else:
        lchild = None

    if len(arr2[flag+1:])>=1:
        rchild = arr1[root-1]
    else:
        rchild = None
    
    tree[arr1[root]] = {'lchild':None,'rchild':None}
    tree[arr1[root]]['lchild'] = lchild
    tree[arr1[root]]['rchild'] = rchild
    
    # print(tree)
    # print(arr1[:flag],arr1[len_left:len_left+len_right])
    # print(arr2[:flag],arr2[flag+1:])
    createTree(arr1[:flag],arr2[:flag],tree) # 左子树
    createTree(arr1[len_left:len_left+len_right],arr2[flag+1:],tree) #右子树

tree = dict()
back = [3,4,2,6,5,1]
mid = [3,2,4,1,6,5]
createTree(back,mid,tree)
复制代码
{1: {'lchild': 2, 'rchild': 5},
 2: {'lchild': 3, 'rchild': 4},
 3: {'lchild': None, 'rchild': None},
 4: {'lchild': None, 'rchild': None},
 5: {'lchild': 6, 'rchild': None},
 6: {'lchild': None, 'rchild': None}}

多级嵌套字典

python 复制代码
def set_nested_dict_value(d, keys, value):
    """
    根据键列表设置嵌套字典的值
    :param d: 原始字典
    :param keys: 键列表
    :param value: 要设置的值
    """
    # 从第一个键开始,逐层深入
    for key in keys[:-1]:
        # 如果当前键不存在,则创建一个空字典
        if key not in d:
            d[key] = {}
        # 下一层字典
        d = d[key]
    # 设置最后一个键的值
    d[keys[-1]] = value

def createTree(arr1,arr2,tree,step):
    print('------------------------------------------')
    # if len(arr1)==0 and len(arr2)==0 :
    #     print('结束')
    #     return

    root = len(arr1)-1
    print(arr1[root],root)

    flag = arr2.index(arr1[root])
    print(flag)

    len_right = len(arr2)-flag-1
    len_left = flag
    if len(arr2[:flag])>=1:
        lchild = arr1[flag-1]
    else:
        lchild = None

    if len(arr2[flag+1:])>=1:
        rchild = arr1[root-1]
    else:
        rchild = None
        
    tmp = dict()
    tmp['root'] = arr1[root]
    if tmp['root']!= None:
        tmp['lchild'] = {'root':lchild,'lchild':None,'rchild':None} if lchild != None else None
        tmp['rchild'] = {'root':rchild,'lchild':None,'rchild':None} if rchild != None else None
    print('tree',tree)
    print('step',step)

    if tree==dict():
        tree.update(tmp)
    else:
        set_nested_dict_value(tree, step, tmp)
    

    # print(tree)
    # print(arr1[:flag],arr1[len_left:len_left+len_right])
    # print(arr2[:flag],arr2[flag+1:])
    # if len(arr1[:flag])>0 and len(arr2[:flag])>0:
    #     createTree(arr1[:flag],arr2[:flag],tree,step+['lchild']) # 左子树
    # if len(arr1[len_left:len_left+len_right])>0 and len(arr2[flag+1:])>0:
    #     createTree(arr1[len_left:len_left+len_right],arr2[flag+1:],tree,step+['rchild']) #右子树
    # if len(arr1[:flag])==0 and len(arr2[:flag])==0 and len(arr1[len_left:len_left+len_right])==0 and len(arr2[flag+1:])==0:
    #     print('chu')
    #     print(tree)

    left_mid = arr2[:flag]
    right_mid = arr2[flag+1:]

    left_back = arr1[:flag]
    right_back = arr1[len_left:len_left+len_right]
    
    print(tree)
    print(left_back,right_back)
    print(left_mid,right_mid)
    if len(left_back)>0 and len(left_mid)>0:
        createTree(left_back,left_mid,tree,step+['lchild']) # 左子树
    if len(right_back)>0 and len(right_mid)>0:
        createTree(right_back,right_mid,tree,step+['rchild']) #右子树
    if len(left_back)==0 and len(left_mid)==0 and len(right_back)==0 and len(right_mid)==0:
        print('chu')
        print(tree)


tree = dict()

back = [3,4,2,6,5,1]
mid = [3,2,4,1,6,5]

createTree(back,mid,tree,[])
tree

简化

python 复制代码
def set_nested_dict_value(d, keys, value):
    """
    根据键列表设置嵌套字典的值
    :param d: 原始字典
    :param keys: 键列表
    :param value: 要设置的值
    """
    # 从第一个键开始,逐层深入
    for key in keys[:-1]:
        # 如果当前键不存在,则创建一个空字典
        if key not in d:
            d[key] = {}
        # 下一层字典
        d = d[key]
    # 设置最后一个键的值
    d[keys[-1]] = value

def createTree(arr1,arr2,tree,step):

    root = len(arr1)-1

    flag = arr2.index(arr1[root])

    len_right = len(arr2)-flag-1
    len_left = flag

    tmp = {'root':arr1[root],'lchild':None,'rchild':None} 

    if tree==dict():
        tree.update(tmp)
    else:
        set_nested_dict_value(tree, step, tmp)
    

    left_mid = arr2[:flag]
    right_mid = arr2[flag+1:]

    left_back = arr1[:flag]
    right_back = arr1[len_left:len_left+len_right]
    

    if len(left_back)>0 and len(left_mid)>0:
        createTree(left_back,left_mid,tree,step+['lchild']) # 左子树
    if len(right_back)>0 and len(right_mid)>0:
        createTree(right_back,right_mid,tree,step+['rchild']) #右子树


tree = dict()

back = [3,4,2,6,5,1]
mid = [3,2,4,1,6,5]

createTree(back,mid,tree,[])
tree
复制代码
{
	'root': 1,
	'lchild': {
		'root': 2,
		 'lchild': {'root': 3, 'lchild': None, 'rchild': None},
		 'rchild': {'root': 4, 'lchild': None, 'rchild': None}},
	'rchild': {
		'root': 5,
		'lchild': {'root': 6, 'lchild': None, 'rchild': None},
		'rchild': None}
  }

步骤二:先序遍历

python 复制代码
def preOrder(tree):
    
    print(tree['root'])
    if tree['lchild']:
        preOrder(tree['lchild'])
    if tree['rchild']:
        preOrder(tree['rchild'])
preOrder(tree)
复制代码
1
2
3
4
5
6
相关推荐
测试老哥15 分钟前
接口测试的测试用例应该怎么写?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
Zenova EdgeOS25 分钟前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
caoerzhong1 小时前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
一木 之林1 小时前
Miniconda 安装与 Jupyter 使用入门
ide·python·jupyter
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
抓不住时间的沙1 小时前
Butterfly主题 5.7 导航栏添加相册同时设置相册入口密码
css·python·node.js
风合星语2 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
彧azz2 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
隐擎fox2 小时前
解构无感人机验证底层机制:行为生物轨迹采样、环境评分模型与自动化对抗实战
自动化测试·python·网络协议·tcp/ip·网络爬虫
haidao0313 小时前
氙灯光源技术特性及其在光催化实验中的标准化应用研究
人工智能·python·能源