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);
}