def recoverFromPreorder(self, S: str) -> TreeNode:
        if not S:
            return None

        S += '-'  # 加一个字符保证最后一个节点也能入栈

        stack = []  # 节点堆栈
        lvl, val = 0, None
        for c in S:
            if c.isdigit():
                if val is None:
                    val = 0
                val = val * 10 + int(c)
            else:
                if val != None:  # 节点入栈
                    if stack:
                        top, topLvl = stack[-1]
                        while topLvl >= lvl:
                            stack.pop()
                            top, topLvl = stack[-1]
                        node = TreeNode(val)
                        if top.left:
                            top.right = node
                        else:
                            top.left = node
                        stack.append((node, lvl))
                    else:
                        stack.append((TreeNode(val), lvl))
                    lvl, val = 0, None  # 入栈之后重置
                lvl += 1  # 层级加1
        return stack[0][0]
Esempio n. 2
0
def testFromList():
    lst = [1, 2, 3, 4, '#', '#', 5]
    expect = TreeNode(1,
                      left=TreeNode(2, left=TreeNode(4)),
                      right=TreeNode(3, right=TreeNode(5)))
    assert str(fromList(lst)) == str(expect)
    assert fromList([]) == None
Esempio n. 3
0
 def create_tree_1():
     """
     A
     +-B
     | +-C
     | \-D
     \-E
       +-F
       | \-G
       \-H
         \-I
           \-J
     :return: TreeNode A
     """
     a = TreeNode("A")
     b = TreeNode("B")
     c = TreeNode("C")
     d = TreeNode("D")
     e = TreeNode("E")
     f = TreeNode("F")
     g = TreeNode("G")
     h = TreeNode("H")
     i = TreeNode("I")
     j = TreeNode("J")
     a.add_node(b)
     a.add_node(e)
     b.add_node(c)
     b.add_node(d)
     e.add_node(f)
     e.add_node(h)
     f.add_node(g)
     h.add_node(i)
     i.add_node(j)
     return a
def string_to_tree_node(string):
    string = string.strip()
    string = string[1:-1]
    if not string:
        return None

    input_values = [s.strip() for s in string.split(',')]
    root = TreeNode(int(input_values[0]))
    node_queue = [root]
    front = 0
    index = 1
    while index < len(input_values):
        node = node_queue[front]
        front = front + 1

        item = input_values[index]
        index = index + 1
        if item != "null":
            left_number = int(item)
            node.left = TreeNode(left_number)
            node_queue.append(node.left)

        if index >= len(input_values):
            break

        item = input_values[index]
        index = index + 1
        if item != "null":
            right_number = int(item)
            node.right = TreeNode(right_number)
            node_queue.append(node.right)
    return root
Esempio n. 5
0
 def test_max_depth_1(self):
     node4 = TreeNode(7, None, None)
     node3 = TreeNode(15, None, None)
     node2 = TreeNode(20, node3, node4)
     node1 = TreeNode(9, None, None)
     root = TreeNode(3, node1, node2)
     test = self.leet104.max_depth(root)
     self.assertEqual(test, 3)
Esempio n. 6
0
 def test_sorted_array_to_bst_1(self):
     node5 = TreeNode(5, None, None)
     node4 = TreeNode(-10, None, None)
     node3 = TreeNode(9, node5, None)
     node2 = TreeNode(-3, node4, None)
     node1 = TreeNode(0, node2, node3)
     test = self.leet108.sorted_array_to_bst([-10, -3, 0, 5, 9])
     self.assertEqual(test.val, 0)
Esempio n. 7
0
 def test_is_balanced_1(self):
     node5 = TreeNode(7, None, None)
     node4 = TreeNode(15, None, None)
     node3 = TreeNode(20, node4, node5)
     node2 = TreeNode(9, None, None)
     node1 = TreeNode(3, node2, node3)
     test = self.leet110.is_balanced(node1)
     self.assertEqual(test, True)
Esempio n. 8
0
 def test_min_depth_1(self):
     node5 = TreeNode(7,None,None)
     node4 = TreeNode(15,None,None)
     node3 = TreeNode(20,node4,node5)
     node2 = TreeNode(9,None,None)
     node1 = TreeNode(3,node2,node3)
     test = self.leet111.min_depth(node1)
     self.assertEqual(test, 2)
Esempio n. 9
0
 def test_min_depth_1(self):
     node5 = TreeNode(7, None, None)
     node4 = TreeNode(15, None, None)
     node3 = TreeNode(20, node4, node5)
     node2 = TreeNode(9, None, None)
     node1 = TreeNode(3, node2, node3)
     test = self.leet112.has_path_sum(node1, 12)
     self.assertEqual(test, True)
Esempio n. 10
0
 def test_is_symmetric_2(self):
     node5 = TreeNode(3, None, None)
     node4 = TreeNode(3, None, None)
     node3 = TreeNode(2, None, node5)
     node2 = TreeNode(2, None, node4)
     node1 = TreeNode(1, node2, node3)
     test = self.leet101.is_symmetric(node1)
     self.assertEqual(test, False)
Esempio n. 11
0
 def test_node_init(self):
     n = TreeNode(factor="amount",
                  level=3,
                  value=5,
                  w=-0.1434,
                  lo_branch="empty",
                  hi_branch="empty")
     self.assertEqual("amount", n.factor)
     n = TreeNode(**{'obj': 33.33})
     self.assertEqual(33.33, n.obj)
Esempio n. 12
0
 def import_node(self, iter, key, tree):
     type = get_json_type(tree)
     if type == "Array":
         new_iter = self.insert(iter, -1, row=[TreeNode(key, [])])
         for child in tree:
             self.import_node(new_iter, None, child)
     elif type == "Object":
         new_iter = self.insert(iter, -1, row=[TreeNode(key, {})])
         for child_key, child in tree.items():
             self.import_node(new_iter, child_key, child)
     else:
         self.insert(iter, -1, row=[TreeNode(key, tree)])
Esempio n. 13
0
    def _buildModel(self):
        batches, specs = self._processDir()

        self._root = TreeNode(None, None)

        for batch in batches:
            newNode = TreeNode(batch, self._root)
            spec = specs.get(batch.name)
            if spec:
                for s in spec:
                    newNode.append_child(TreeNode(s, newNode))
            self._root.append_child(newNode)
Esempio n. 14
0
	def loadfromInitData(self): 
		rootNode = TreeNode(0,'root')
		tempid = 100
		for key in data:
			parentNode = TreeNode(tempid,key,parent=rootNode)
			for leaf in data[key]:
				leafNode = TreeNode(leaf[0],leaf[1],color=leaf[2],accu=leaf[3],parent=parentNode)
			tempid += 1
		self.mymodel = rootNode

		for node in self.mymodel.children:
			self.myscene.addItem(NodeGraphicsItem(node))
Esempio n. 15
0
	def _put(self, key, val, currentNode):
		if key <= currentNode.key:
			if currentNode.hasLeftChild():
				self._put(key, val, currentNode.leftChild)
			else:
				currentNode.leftChild = TreeNode(key, val, parent=currentNode)
				self.updateBalance(currentNode.leftChild)
		else:
			if currentNode.hasRightChild():
				self._put(key, val, currentNode.rightChild)
			else:
				currentNode.rightChild = TreeNode(key, val, parent=currentNode)
				self.updateBalance(currentNode.rightChild)
Esempio n. 16
0
def make_tree(train_array):
    global current_instances
    global blocked_features
    global tree_nodes
    current_instances = []
    while (calculate_global_entropy(current_instances) == 0):
        current_instances.append(train_array.pop(0))
    choose_root()
    for ins in train_array:
        (should_change, new_node_place, child_node,
         parent_node) = tree_root.add_instance(ins)
        current_instances.append(ins)
        if (should_change):
            #blocked_features = list(set().union(blocked_features , list(child_node.get_path_to_root().keys()) ))
            #print(child_node.get_path_to_root())
            #print(blocked_features)
            related_instances = query(child_node.get_path_to_root())
            new_feature_name = get_best_feature(parent_node, related_instances)
            if (new_feature_name != None):
                #blocked_features.append(new_feature_name) ####
                (new_featre_total_labels,
                 new_feature_attr_labels) = get_feature_labels(
                     new_feature_name, related_instances)
                new_node = TreeNode(parent_node, new_feature_name,
                                    new_feature_attr_labels, None, True, True,
                                    new_featre_total_labels)
                parent_node.children_nodes[
                    new_node_place].visual_node.parent = None
                parent_node.children_nodes[new_node_place] = new_node
                try:
                    tree_nodes.remove(tree_nodes.index(child_node))
                except:
                    pass
                new_node_children_nodes = {}
                new_node_children_labels = {}
                tree_nodes.append(new_node)
                for attr_name in list(new_node.children_labels.keys()):
                    temp_node = TreeNode(new_node, None, None, None, True,
                                         False,
                                         new_node.children_labels[attr_name])
                    new_node_children_nodes[str(attr_name)] = temp_node
                    tree_nodes.append(temp_node)
                new_node.children_nodes = new_node_children_nodes
            else:
                continue

    check_for_pull_up()
    for pre, fill, node in RenderTree(tree_root.visual_node):
        print("%s%s" % (pre, node.name))
Esempio n. 17
0
 def _put(self, root: TreeNode, key):
     if root.key == key:
         root.key = key
     elif key < root.key:
         if root.hasLeftChild():
             self._put(root.leftChild, key)
         else:
             root.leftChild = TreeNode(key, root)
             self._size += 1
     else:
         if root.hasRightChild():
             self._put(root.rightChild, key)
         else:
             root.rightChild = TreeNode(key, root)
             self._size += 1
Esempio n. 18
0
def choose_root():
    global current_labels
    global current_instances
    global tree_nodes
    global visual_nodes
    global tree_root
    global blocked_features
    tree_nodes = []
    feature_dict = {}
    for feature in list(current_instances[0].feature_dict.keys()):
        if (feature not in blocked_features):
            feature_dict[feature] = calculate_global_entropy(
                current_instances) - get_feature_entropy(feature)
    #print(feature_dict)
    feature_name = max(feature_dict, key=feature_dict.get)
    node = TreeNode(parent=None,
                    feature_name=str(feature_name),
                    children_labels=None,
                    children_nodes=None,
                    is_leaf=True,
                    is_feature=True,
                    labels=get_global_labels())
    root = Node(node.feature_name)
    blocked_features.append(node.feature_name)
    visual_nodes.append(root)
    tree_nodes.append(node)
    tree_root = node
    node_children_labels = {}
    node_children_nodes = {}
    for attr in get_feature_attrs(node.feature_name):
        temp_node = TreeNode(parent=node,
                             feature_name=None,
                             children_labels=None,
                             children_nodes=None,
                             is_leaf=True,
                             is_feature=False,
                             labels=get_feature_attrs(node.feature_name)[attr])
        temp_visual_node = Node(str(attr) + "[" + str(temp_node.labels[0]) +
                                "," + str(temp_node.labels[1]) + "]",
                                parent=root)
        node_children_labels[str(attr)] = temp_node.labels
        node_children_nodes[str(attr)] = temp_node
        tree_nodes.append(temp_node)
    node.children_labels = node_children_labels
    node.children_nodes = node_children_nodes
    current_instances = []
    #print(node.feature_name)
    return
Esempio n. 19
0
def rebuild_tree(pre_order, in_order, length):
    """
    根据前序遍历和中序遍历重建二叉树
    所构建的二叉树是否唯一?参考:https://www.cnblogs.com/jiaxin359/p/9512348.html
    :param pre_order:
    :param in_order:
    :param length:
    :return:
    """
    if len(pre_order) == 0 or len(in_order) == 0 or length <= 0:
        return None

    i = 0
    tn = pre_order[0]
    root = TreeNode(tn)

    while i < length and in_order[i] != tn:
        i += 1

    if i == length:
        return None

    root.left = rebuild_tree(pre_order[1:], in_order, i)
    root.right = rebuild_tree(pre_order[i + 1:], in_order[i + 1:],
                              length - i - 1)
    return root
 def postorderTraversal(self, root):
     """
     :type root: TreeNode
     :rtype: List[int]
     """
     prev = TreeNode(-1) # fake node
     res = []
     if not root:
         return res
     stk = []
     stk.append(root)
     while stk:
         top = stk[-1]
         if top.left and top.left is not prev and top.right != prev:
             cur = top.left
             while cur:
                 stk.append(cur)
                 cur = cur.left
         elif top.right and top.right is not prev:
             cur = top.right
             while cur:
                 stk.append(cur)
                 cur = cur.left
         else:
             prev = stk.pop()
             res.append(prev.val)
     return res
Esempio n. 21
0
    def addToTree(self, data):
        """Add data to the tree.

        :param int data: data to be added to new node
        """
        if self._findData(self.root, data):
            raise Exception("Data already exists")

        node = TreeNode(data)
        tmp_node = self.root
        parent_node = None
        while tmp_node:
            parent_node = tmp_node
            if data < tmp_node.val:
                tmp_node = tmp_node.left
            else:
                tmp_node = tmp_node.right

        if not parent_node:
            self.root = node
        else:
            if parent_node.val > data:
                parent_node.setLeft(node)
            else:
                parent_node.setRight(node)
            self.root = BinaryTree._balanceBst(self.root)
Esempio n. 22
0
    def sorted_array_to_bst(self, nums):
        """
        Converted an array of nums into a tree.

        Args:
            nums -- An array of nums sorted in ascending order.

        Returns:
            TreeNode
        """

        # Time: O(n) where n is the number of items in the list.
        # Space: O(1)
        if not nums:
            return None

        n = len(nums)

        if n % 2 == 0:
            mid = int(n / 2) - 1
        else:
            mid = int(n / 2)

        node = TreeNode(nums[mid])
        node.left = self.sorted_array_to_bst(nums[:mid])
        node.right = self.sorted_array_to_bst(nums[mid + 1:])

        return node
Esempio n. 23
0
    def read_tree(self, parent_line, token_line):
        parents = list(map(lambda x: int(x) - 1,parent_line.split()))
        tokens = token_line.strip().split()
        tree_nodes = dict()
        root = None
        for i in range(len(parents)):
            crnt_node_id = i
            if crnt_node_id not in tree_nodes.keys():
                prev_node = None
                while True:
                    if crnt_node_id == -1:
                        break
                    parent_node_id = parents[crnt_node_id]

                    crnt_node = TreeNode()
                    if prev_node is not None:
                        crnt_node.add_child(prev_node)
                    tree_nodes[crnt_node_id] = crnt_node
                    crnt_node.idx = crnt_node_id
                    crnt_node.token = tokens[crnt_node_id]
                    #if trees[parent-1] is not None:
                    if parent_node_id in tree_nodes.keys():
                        tree_nodes[parent_node_id].add_child(crnt_node)
                        break
                    elif parent_node_id == -1:
                        root = crnt_node
                        break
                    else:
                        prev_node = crnt_node
                        crnt_node_id = parent_node_id
        return root
Esempio n. 24
0
def create(nums: list) -> TreeNode:
    if not nums:
        return
    node = TreeNode(nums[len(nums) // 2])
    node.left = create(nums[:len(nums) // 2])
    node.right = create(nums[len(nums) // 2 + 1:])
    return node
 def _calc_split(self, data, target):
     rv = {"obj": float("inf")}
     for factor in [x for x in data.columns if x not in [target, Y]]:
         values = data[factor].unique()
         if len(values) > 1:
             print("{} ({})".format(factor, len(values)))
             for value in values:
                 print(".", end="", flush=True)
                 lo_data = data[data[factor] <= value]
                 hi_data = data[data[factor] > value]
                 if hi_data.shape[0] > 0:
                     obj, lo_w, hi_w = self._get_obj(
                         self._get_g(lo_data, target),
                         self._get_h(lo_data, target),
                         self._get_g(hi_data, target),
                         self._get_h(hi_data, target))
                     if obj < rv.get('obj'):
                         rv = {
                             'obj': obj,
                             'factor': factor,
                             'value': value,
                             'lo_data': lo_data,
                             'hi_data': hi_data,
                             'lo_w': lo_w,
                             'hi_w': hi_w
                         }
             print("")
     return TreeNode(
         **{k: v
            for k, v in rv.items() if k in TreeNode.fieldnames}), rv
Esempio n. 26
0
 def buildTree(self, preorder: list, inorder: list) -> TreeNode:
     if preorder:
         root = TreeNode(preorder[0])
         mid = inorder.index(preorder[0])
         root.left = self.buildTree(preorder[1:mid+1], inorder[0:mid])
         root.right = self.buildTree(preorder[mid+1:len(preorder)], inorder[mid+1:len(inorder)])
         return root
Esempio n. 27
0
 def test_node_evaluate(self):
     n_low = TreeNode(w=-0.1434)
     n_hi = TreeNode(w=-0.456)
     n_week = TreeNode(factor="day_of_week",
                       value=3,
                       lo_branch=n_low,
                       hi_branch=n_hi)
     n_bigamount = TreeNode(w=0.2)
     n_root = TreeNode(factor="amount",
                       value=5,
                       lo_branch=n_week,
                       hi_branch=n_bigamount)
     data1 = {'amount': 2, 'day_of_week': 2}
     data2 = {'amount': 8, 'day_of_week': 2}
     self.assertEqual(-0.1434, n_root.evaluate(data1))
     self.assertEqual(0.2, n_root.evaluate(data2))
 def test_9():
     root9 = TreeNode(
         20,
         TreeNode(
             10,
             TreeNode(5, TreeNode(3, None, None), TreeNode(7, None, None)),
             TreeNode(15, None, TreeNode(17, None, None))),
         TreeNode(30, None, None))
     return (BinarySearchTree.isBinarySearchTree(root9))
Esempio n. 29
0
    def __init__(self, root_val=None):
        """
        Just need a pointer to root node

        Args:
            root_val (int): value to be stored in root node
        """
        self.root = TreeNode(root_val)
Esempio n. 30
0
 def buildTree(self, inorder: list, postorder: list) -> TreeNode:
     if inorder:
         root = TreeNode(postorder[len(postorder) - 1])
         mid = inorder.index(postorder[len(postorder) - 1])
         root.left = self.buildTree(inorder[0:mid], postorder[0:mid])
         root.right = self.buildTree(inorder[mid + 1:len(inorder)],
                                     postorder[mid:len(inorder) - 1])
         return root