玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2
 
这个题和刚刚写的那个类似也是一个建树的过程;
比如中序是1 2 3 4 5 6  7  前序是 4 1 3 2 6 5 7   由前序可得4是树根,1是4的左孩子,然后通过中序可知1 2 3是左子树5 6 7是右子树,通过前序可知6是4 的右孩子,这样依次递归。
代码:
  
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <set>
 4 #include <vector>
 5 #include <cstring>
 6 #include <queue>
 7 #include <algorithm>
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn=1e5+5;
11 int mid[50],pre[50];
12 struct node
13 {
14     int data;
15     node *LNode;
16     node *RNode;
17 };
18 node* build(int *mid,int *pre,int n)
19 {
20     if(n<=0)return NULL;
21     int *p=mid;
22     while(p)
23     {
24         if(*p==*pre)
25             break;
26         p++;
27     }
28     node *T=new node;
29     T->data=*p;
30     int len=p-mid;
31     T->LNode=build(mid,pre+1,len);
32     T->RNode=build(p+1,pre+len+1,n-len-1);
33     return T;
34 }
35 void cengprint(node *T)
36 {
37     queue<node*> q;
38     q.push(T);
39     int flag=0;
40     while(!q.empty())
41     {
42         node *x=q.front();
43         if(!flag)
44             printf("%d",x->data),flag++;
45         else
46             printf(" %d",x->data);
47         q.pop();
48         if(x->RNode)
49             q.push(x->RNode);
50         if(x->LNode)
51             q.push(x->LNode);
52 
53     }
54 }
55 int main()
56 {
57     int n;
58     cin>>n;
59     for(int i=0;i<n;i++)
60         scanf("%d",&mid[i]);
61     for(int i=0;i<n;i++)
62         scanf("%d",&pre[i]);
63     node *T;
64     T=build(mid,pre,n);
65     cengprint(T);
66     printf("\n");
67     return 0;
68 }

 

转载于:https://www.cnblogs.com/Cherry93/p/9935284.html

### 使用数组表示和操作二叉树的方法 #### 数组表示二叉树的基础原理 在计算机科学中,完全二叉树可以通过数组来高效地表示。如果一个二叉树是完全二叉树,则可以利用其特性将其映射到一个连续的线性结构——数组中[^2]。具体来说: - 假设根节点位于索引 `1` 处(通常为了简化计算而不使用索引 `0`),则对于任意节点 `i`: - 左子节点的位置为 `2 * i`。 - 右子节点的位置为 `2 * i + 1`。 - 父节点的位置为 `floor(i / 2)`。 这种关系使得通过简单的算术运算即可访问任何节点及其父节点或子节点[^5]。 #### 示例:将有序数组转化为平衡二叉搜索树 假设有一个升序排列的数组 `[−10, −3, 0, 5, 9]`,目标是将其转换为一棵高度平衡的二叉搜索树 (BST)[^3]。以下是实现这一过程的具体方法: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def sorted_array_to_bst(nums): if not nums: return None mid = len(nums) // 2 root = TreeNode(nums[mid]) # 中间元素作为当前子树的根节点 root.left = sorted_array_to_bst(nums[:mid]) # 左半部分构建左子树 root.right = sorted_array_to_bst(nums[mid+1:]) # 右半部分构建右子树 return root # 测试代码 nums = [-10, -3, 0, 5, 9] bst_root = sorted_array_to_bst(nums) # 打印函数用于验证结果 def inorder_traversal(root): return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right) if root else [] print(inorder_traversal(bst_root)) # 输出应原数组相同 ``` 上述代码展示了如何递归地选取中间值作为根节点,并分别处理左右两部分以形成平衡 BST[^4]。 #### LeetCode 题目中的应用实例 在 LeetCode 的某些题目中也涉及到了数组二叉树之间的相互转化。例如,在第 94 题 “二叉树的中序遍历” 和第 919 题 “完全二叉树插入器” 中均提到了类似的思路[^1]。这些题目强调了理解完全二叉树特性的必要性以及基于此设计数据结构的能力。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值