【问题标题】:printing value from node从节点打印值
【发布时间】:2014-05-23 01:45:11
【问题描述】:

我正在尝试遍历一个“位串”,它给出了一个二叉树的方向。我遇到的问题是在节点到达末尾(null)时打印节点的值,然后返回到顶部,直到最后命中“位字符串”中的某个字符。

所以字符串:

char * directions = "RRLRRLRLLRLRRS";

将从根开始然后向右>右>左>右(假设击中离开)然后它会回到根并遍历右>左>右>左>左(然后切换回每次找到叶子的根,然后一旦它击中“S”,它就会停止遍历。

我现在拥有的代码现在正试图从它最后命中的节点中获取值以进行调试,并且它没有打印任何内容。如何解决这个问题?

(顺序只是帮助确定它在树中的位置)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
  int order;
  char value;
  struct Node * left;
  struct Node * right;
} Node;

Node * insert(Node * node, char value, int order){
  if(node == NULL){
    node = (Node *)malloc(sizeof(Node));
    node->value = value;
    node->order = order;
    node->left = NULL;
    node->right = NULL;
    return node;
  }
  if(order > node->order){
    node->right = insert(node->right, value, order);
  }
  else if(order < node->order){
    node->left = insert(node->left, value, order);
  }
  else {
    return;
  }
  return node;
}

int main(){


  Node * root = NULL;
  char * directions = "RRLRRLRLLRLRRS";
  int length = (int)strlen(directions);
  int i;

  root = insert(root, -1, 6);
  root = insert(root, -1, 4);
  root = insert(root, -1, 2);
  root = insert(root, 32, 1);
  root = insert(root, 114, 3);
  root = insert(root, 108, 5);
  root = insert(root, -1, 12);
  root = insert(root, -1, 8);
  root = insert(root, 111, 7);
  root = insert(root, -1, 10);
  root = insert(root, 101, 9);


  /* basics to see values at this point */
  i = 0;
  while(directions[i] != 'S'){
    if(directions[i] == 'L'){
      printf(root->value);
      root = root->left;
    }
    else if(directions[i] == 'R'){
      printf(root->value);
      root = root->right;     
    }
    i++;
  }

  return 0
}

【问题讨论】:

    标签: c struct nodes


    【解决方案1】:

    如果我尝试按原样运行它,您的代码段会出错,因为您在点击叶节点后没有“重置”根。我修改了您的 printf 语句以打印出 Node 结构的实际 int 字段,并添加了一个 if-else 来测试您遍历中的当前节点是否是叶子:

      ...
    
      Node * origRoot = root;
    
      i = 0;
      while(directions[i] != 'S'){
        if(directions[i] == 'L'){
          printf("%d\n", root->order);
          if(root->left == NULL)
            root = origRoot;   
          else      
            root = root->left;
        }
        else if(directions[i] == 'R'){
          printf("%d\n", root->order);
          if(root->right == NULL)
            root = origRoot;   
          else      
            root = root->right;           
        }
        i++;
      }
    
      ...
    

    我在这里提供了一个可视化并逐步执行代码:gist.github.com/liangricha/10337524

    【讨论】:

    • 这并没有正确返回原始根,然后再次正确遍历。并且应该是 root->right 在最后一个 else :)
    猜你喜欢
    • 2023-02-25
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多