Hello Marc, you might want to look at the intro to algorithms and data structures course from Sedgewick (your specific problem is discussed here: https://www.cs.princeton.edu/courses/archive/spring15/cos226/lectures/31ElementarySymbolTables+32BinarySearchTrees.pdf, p50/51 (slide 22 specifically). In short: Level-order traversal is better solved using an iterative approach. I also believe that your problem is not specific to sklearn, right?
Best regards Christian Am So., 14. Jan. 2024 um 22:13 Uhr schrieb marc nicole <mk1853...@gmail.com >: > Hi all, > > Suppose I have this binary tree that I want to level-based traverse using > recursive algorithm: > > . > └── 1/ > ├── 2/ > │ ├── 3/ > │ │ ├── 4 > │ │ └── 9 > │ └── 30 > └── 71/ > ├── 72 > └── 99 > > I wrote this algorithm inspired by the level first traversal of a tree > algorithm which stops at a certain input depth: > > def get_subtree_from_rt(subtree, root_start, max_depth): > if max_depth == 0: > return [] > nodes = [root_start] > if root_start == -1: > return [] > else: > nodes.extend([subtree.children_left[root_start], > subtree.children_right[root_start]]) > print(nodes) > nodes.extend(child for child in get_subtree_from_rt(subtree, > subtree.children_left[root_start], max_depth - 1) if > child not in list(filter(lambda a: a != -1, nodes))) > > nodes.extend(child for child in get_subtree_from_rt(subtree, > subtree.children_right[root_start], max_depth - 1) if > child not in list(filter(lambda a: a != -1, nodes))) > return nodes > > The algorithm does traverse the tree but in an unwanted order, namely the > returned result for the mentioned tree was: > > [1, 2, 71, 3, 30, 4, 9] > > While the right one should have been: > > [1, 2, 71, 3, 30, 72, 99] > > Indeed the root_start is not the same for both recursive calls, since the > first recursive call alters its value. > > > My question is how to obtain the mentioned results but avoid calling the > second recursive call on a different root_start value? > > use: tree_stucture as input as subtree > > import pandas as pd > import numpy as np > from sklearn import * > from sklearn.model_selection import train_test_split > from sklearn.tree import DecisionTreeRegressor > from sklearn import tree > dataset = pd.read_csv("anydatasetPath") > x = dataset.drop(dataset.columns[9],axis = 1) > y = dataset.iloc[:,9] > > x_train, x_test,y_train,y_test = train_test_split(x,y,test_size= > 0.2,random_state = 28) > > > model = DecisionTreeRegressor(random_state=0) > model.fit(x_train,y_train) > y_pred = model.predict(x_test) > > tree_stucture = model.tree_ > > print(get_subtree_from_rt(tree_stucture,1,3)) > > > > with many thanks > > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn >
_______________________________________________ scikit-learn mailing list scikit-learn@python.org https://mail.python.org/mailman/listinfo/scikit-learn