(二叉)树的遍历

树,包括图,在遍历时都存在两种方式:深度优先遍历和广度优先遍历。
树,一定有一个根节点,而图,没有根节点,但图中的任意节点都可以作为根节点使用(当然该节点一定要有边,否则没有意义)

深度优先遍历

  1. 访问当前节点
  2. 将当前节点的children作为子树的根节点递归访问
使用递归的方式
// 传入树的根节点,开始深度优先遍历
function dfs(root) {
  // 访问节点数据
  console.log(root.val);
  if (root.children.length > 0) {
    for(let i = 0; i < root.children.length; i ++) {
      dfs(root.children[i]);
    }
    // 或者使用root.children.forEach(dfs)来替换上面的for循环
  }
}

广度优先遍历

  1. 新建队列,将根节点入队
  2. 队列出队,访问出队节点
  3. 将出队节点的children依次入队
  4. 重复2和3,直到队列为空
使用队列的方式
// 传入树的根节点,开始深度优先遍历
function bfs(root) {
  const queue = [];
  queue.push(root);
  while(queue.length > 0) {
    const node = queue.shift();
    console.log(node.val);
    node.children && node.children.forEach(child => queue.push(child))
  }
}

在打包模块时,可以使用广度优先遍历从入口文件触发,构建模块的依赖图谱。

二叉树的先中后序遍历

先、中、后指的是根节点的访问顺序

先序遍历
  1. 访问根节点
  2. 对左子树先序遍历
  3. 对右子树先序遍历
// 先序遍历
function preOrder(root) {
  // 递归终止条件
  if (!root) return;
  console.log(root.val);
  preOrder(root.left);
  preOrder(root.right);
}
中序遍历
  1. 对左子树中序遍历
  2. 访问根节点
  3. 对右子树中序遍历
// 中序遍历
function inOrder(root) {
  if (!root) return;
  inOrder(root.left);
  console.log(root.val);
  inOrder(root.right);
}
后序遍历
  1. 对左子树后序遍历
  2. 对右子树后序遍历
  3. 访问根节点
// 后序遍历
function postOrder(root) {
  if (!root) return;
  postOrder(root.left);
  postOrder(root.right);
  console.log(root.val)
}

非递归型的遍历

所有的递归都可以用栈来代替,因为递归函数底层就是使用栈来实现的。

先序遍历
  1. 访问根节点
  2. 对左子树先序遍历
  3. 对右子树先序遍历
function preOrder(root) {
  if (!root) {return;}
  const stack = [];
  stack.push(root);
  while(stack.length > 0) {
    // 出栈
    const node = stack.pop();
    console.log(node.val);
    // 将左右子树入栈, 先让右子树入栈,再让左子树入栈
    if (node.right) {
      stack.push(node.right);
    }
    if (node.left) {
      stack.push(node.left);
    }
  }
}
中序遍历
  1. 对左子树中序遍历
  2. 访问根节点
  3. 对右子树中序遍历
// 中序遍历
function inOrder(root) {
  if (!root) {return;}
  const stack = [];
  let p = root;
  while(p || stack.length > 0) {
    while(p) {
      // 先将左子树不断入栈
      stack.push(p);
      p = p.left;
    }
    // 所有左子树都入栈后,开始出栈访问
    const node = stack.pop();
    console.log(node.val);
    // 将右子树入栈
    p = node.right;
  }
}
后序遍历
  1. 对左子树后序遍历
  2. 对右子树后序遍历
  3. 访问根节点
// 后序遍历
function postOrder(root) {
  if (!root) {return;}
  const stack = [];
  const outPutStack = [];
  stack.push(root);
  // 对前序遍历进行改造,前序遍历是 根 -> 左 -> 右,后续遍历是左 -> 右 -> 根,
  // 将前序遍历改造成 根 -> 右 -> 左,然后逆序输出访问即可
  while(stack.length > 0) {
    // 出栈
    const node = stack.pop();
    outPutStack.push(node)
    // 前序遍历改造,先将左子树入栈,再将右子树入栈
    if (node.left) {
      stack.push(node.left);
    }
    if (node.right) {
      stack.push(node.right);
    }
  }
  while(outPutStack.length > 0) {
    const node = outPutStack.pop();
    console.log(node.val);
  }
}
AI实战-学生生活方式模式数据集分析预测实例(含24个源代码+69.54 KB完整的数据集) 代码手工整理,无语法错误,可运行。 包括:24个代码,共149.89 KB;数据大小:1个文件共69.54 KB。 使用到的模块: pandas os matplotlib.pyplot seaborn plotly.express warnings sklearn.model_selection.StratifiedShuffleSplit sklearn.pipeline.Pipeline sklearn.compose.ColumnTransformer sklearn.impute.SimpleImputer sklearn.preprocessing.OrdinalEncoder numpy sklearn.model_selection.cross_val_score sklearn.linear_model.LinearRegression sklearn.metrics.mean_squared_error sklearn.tree.DecisionTreeRegressor sklearn.ensemble.RandomForestRegressor sklearn.model_selection.train_test_split sklearn.preprocessing.PowerTransformer imblearn.pipeline.Pipeline imblearn.over_sampling.SMOTE sklearn.ensemble.AdaBoostClassifier sklearn.metrics.accuracy_score sklearn.metrics.precision_score sklearn.metrics.recall_score sklearn.metrics.f1_score optuna scipy.stats torch torch.nn torchvision.transforms torchvision.models torch.optim cv2 glob glob.glob torch.utils.data.DataLoader torch.utils.data.Dataset random.shuffle torch.utils.data.random_split torchsummary.summary matplotlib.ticker pyspark.sql.SparkSession pyspark.sql.functions.count pyspark.sql.functions.max pyspark.sql.functions.min pyspark.sql.functions.avg pyspark.sql.functions.stddev_samp pyspark.sql.functions.skewness pyspark.sql.functions.kurtosis pyspark.sql.functions pyspark.ml.feature.Tokenizer pyspark.ml.feature.VectorAssembler sklearn.preprocessing.LabelEncoder keras.models.Sequential keras.layers.Dense keras.utils.to_categorical ptitprince statsmodels.distributions.empirical_distribution.ECDF statsmodels.stats.outliers_influence.variance_inflation_factor ppscore sklearn.feature_selection.mutual_info_classif sklearn.decomposition.PCA sklearn.model_selection.StratifiedKFold sklearn.tree.DecisionTreeClassifier sklearn.metrics.balanced_accuracy_score sklearn.metrics.confusion_matrix mlxtend.plotting.plot_confusion_matrix scipy.stats.pearsonr scipy.stats.f_oneway sklearn.feature_selection.mutual_info_regression sklearn.feature_selecti
AI实战-信用卡申请风险识别数据集分析预测实例(含9个源代码+91.57 KB完整的数据集) 代码手工整理,无语法错误,可运行。 包括:9个代码,共44.98 KB;数据大小:1个文件共91.57 KB。 使用到的模块: pandas os matplotlib.pyplot seaborn wordcloud.WordCloud sklearn.model_selection.train_test_split sklearn.preprocessing.LabelEncoder sklearn.ensemble.RandomForestClassifier sklearn.metrics.accuracy_score sklearn.metrics.classification_report sklearn.metrics.confusion_matrix plotly.express plotly.subplots.make_subplots plotly.graph_objects plotly.io sklearn.base.BaseEstimator sklearn.base.TransformerMixin sklearn.preprocessing.StandardScaler sklearn.preprocessing.OrdinalEncoder sklearn.pipeline.make_pipeline sklearn.compose.make_column_transformer imblearn.over_sampling.RandomOverSampler sklearn.svm.SVC sklearn.tree.DecisionTreeClassifier sklearn.ensemble.HistGradientBoostingClassifier sklearn.ensemble.GradientBoostingClassifier sklearn.neighbors.KNeighborsClassifier sklearn.model_selection.GridSearchCV sklearn.ensemble.VotingClassifier torch lightning torchmetrics.Accuracy torch.utils.data.Dataset torch.utils.data.DataLoader numpy warnings matplotlib wordcloud.STOPWORDS collections.Counter sklearn.ensemble.ExtraTreesClassifier sklearn.ensemble.AdaBoostClassifier sklearn.ensemble.BaggingClassifier xgboost.XGBClassifier lightgbm.LGBMClassifier catboost.CatBoostClassifier sklearn.linear_model.LogisticRegression sklearn.model_selection.RandomizedSearchCV sklearn.preprocessing.MinMaxScaler imblearn.over_sampling.SMOTE
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值