ACM模式 根据数组构造二叉树
参考:
https://github.com/youngyangyang04/leetcode-master/blob/master/problems/前序/ACM模式如何构建二叉树.md
迭代方式从数组构建二叉树
# Definition for a binary tree node.
import collections
from json.tool import main
import re
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def construct_bin_tree(nums):
tree = []
root = None
# 先根据数据列表获得对应的节点列表
for i in range(len(nums)):
node = None
if nums[i] != -1: # -1指代是None
node = TreeNode(nums[i])
tree.append(node) # 加入的是节点或者None
if i == 0:
root = node
# 根据数据列表的关系,设置节点的left和right指针
i = 0
while i * 2 + 2 < len(nums):
if tree[i]:
tree[i].left = tree[i * 2 + 1]
tree[i].right = tree[i * 2 + 2]
i += 1
return root
# 层次打印二叉树
def print_bin_tree(root):
if not root: return []
q = collections.deque()
q.append(root)
res = []
while q:
row_size = len(q)
row = []
for i in range(row_size):
nd = q.popleft()
row.append(nd.val)
if nd.left:
q.append(nd.left)
if nd.right:
q.append(nd.right)
res.append(row)
return res
nums = [4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8]
root = construct_bin_tree(nums)
print(print_bin_tree(root))
[[4], [1, 6], [0, 2, 5, 7], [3, 8]]
递归的方式从数组构建二叉树
参考:https://blog.csdn.net/weixin_54110641/article/details/121912415
可以采用递归的方式从数组构建二叉树
#include
using namespace std;
#include
struct Node {//我们先自己定义一个数据结构模拟数
int val;
Node* left;
Node* right;
Node(int val) {
this->val = val;
left = nullptr;
right = nullptr;
}
};
class Bree {
Node* root;
};
Node* creatBree(vector&nums, int index) {//返回值就是返回根节点,参数就是下标和构建数组
/*
* 写递归函数可以三步走
* 1.明确递归函数返回值以及参数定义
* 2.明确递归结束条件
* 3.确定单层操作
*/
if (index >= nums.size());//递归结束条件
{
return nullptr;
}
int left = index * 2 + 1;//左右子树关系可以自己画个数组下标(用下标进行模拟)进行标记
int right = index * 2 + 2;
Node* root = new Node(nums[index]);//创建根节点
root->left = creatBree(nums, left);
root->right = creatBree(nums, right);
return root;
}
int main() {
vectornums{ 1, 7, 5, 4, 9, 8, 10 };
Node* root = creatBree(nums, 0);
}