我有一个左右兄弟姐妹,如下所示:
10
* |
* 2 -> 3 -> 4 -> 5
* | |
* 6 7 -> 8 -> 9 */
我想从根节点遍历到最后一个节点,遍历函数如下:
void traverseTree(Node * root)
{
if (root == NULL)
return;
while (root)
{
cout << " " << root->data;
if (root->child)
traverseTree(root->child);
root = root->next;
}
}
正如我所理解的,如果节点有一个子节点,那么指针指向它的子节点,否则指向同级节点(下一个)。在这种情况下,当指针指向元素6时,它将转到根-
下面是重新创建树的代码:
// CPP program to create a tree with left child
// right sibling representation.
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int data;
struct Node *next;
struct Node *child;
};
// Creating new Node
Node* newNode(int data)
{
Node *newNode = new Node;
newNode->next = newNode->child = NULL;
newNode->data = data;
return newNode;
}
// Adds a sibling to a list with starting with n
Node *addSibling(Node *n, int data)
{
if (n == NULL)
return NULL;
while (n->next)
n = n->next;
return (n->next = newNode(data));
}
// Add child Node to a Node
Node *addChild(Node * n, int data)
{
if (n == NULL)
return NULL;
// Check if child list is not empty.
if (n->child)
return addSibling(n->child, data);
else
return (n->child = newNode(data));
}
// Traverses tree in level order
void traverseTree(Node * root)
{
if (root == NULL)
return;
while (root)
{
cout << " " << root->data;
if (root->child)
traverseTree(root->child);
root = root->next;
}
}
//Driver code
int main()
{
Node *root = newNode(10);
Node *n1 = addChild(root, 2);
Node *n2 = addChild(root, 3);
Node *n3 = addChild(root, 4);
Node *n4 = addChild(n3, 6);
Node *n5 = addChild(root, 5);
Node *n6 = addChild(n5, 7);
Node *n7 = addChild(n5, 8);
Node *n8 = addChild(n5, 9);
traverseTree(root);
return 0;
}
执行traverseTree(root-
void traverseTree(Node * root)
{
if (root == NULL)
return;
while (root)
{
cout << " " << root->data;
if (root->child)
traverseTree(root->child); // First, if child exists, traverse child. No return statement following here.
root = root->next; // Next, traverse sibling
}
}
如果您仍然有疑问,那么在调用函数时阅读有关程序流的信息会对您有好处。
更新(与问题完全无关):根据OP的要求,使用堆栈解决方案:
void traverseTree(Node * root)
{
if (root == NULL)
return;
stack<Node*> s;
s.push(root);
while (!s.empty())
{
Node* top = s.top();
cout << " " << top->data;
s.pop();
if (top->next) s.push(top->next);
if (top->child) s.push(top->child);
}
}
前面讲解了存储普通树的双亲表示法和孩子表示法,本节来讲解最后一种常用方法—— 孩子兄弟表示法。 图 1 普通树示意图 树结构中,位于同一层的节点之间互为兄弟节点。例如,图 1 的普通树中,节点 A、B 和 C 互为兄弟节点,而节点 D、E 和 F 也互为兄弟节点。 孩子兄弟表示法,采用的是链式存储结构,其存储树的实现思想是:从树的根节点开始,依次用链表存储各个节点的孩子节点和兄弟节点。 因此,该
试图遍历一棵树并为我的数组获取空值。我需要遍历只允许访问节点类的类定义中没有根的右和左子级的树。 它需要输入 这应该返回[1,2,4,3,5],我得到了[]。我也尝试过像这样循环 这也不管用。这也会给我一个[]数组。遍历应该从左到右在树高(即树高)指示的树级别上打印树。有什么想法吗?
面试过了,面试体验非常棒! 面试官是我老乡,人特别好~ 面经如下: 1.自我介绍 2.为什么不考研 3.JVM内存结构 4.arraylist和linkedlist的区别 5.string,stringbuffer,stringbuilder的区别 6.锁在项目中的应用 7.三次握手四次挥手 8.项目问题和亮点 9.反问 总而言之,还是很不错的啦! #哪些公司面试官让你印象深刻?##我的实习求职记
本文向大家介绍Python selenium 父子、兄弟、相邻节点定位方式详解,包括了Python selenium 父子、兄弟、相邻节点定位方式详解的使用技巧和注意事项,需要的朋友参考一下 今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个
问题内容: 我正在尝试使用NHibernate 3.0的LINQ接口执行以下操作。我想查询一个对象(使用一些Where子句),并加载一些子代和孙代。目前,我正在这样做: 但是,这将导致所有子孙之间的笛卡尔积(每个结果行包含许多列)。这在这里由“ ayende”讨论。另一方面,我得到了一次往返,这与拆分查询然后进行合并不同。 在仍使用NHibernate的LINQ接口的情况下,如何更好地(在SQL和
我一直在读这篇文章:多嵌套路由反应路由器多姆v4和一些喜欢它,我不能让我的情况下工作。 这里有两个repl在尝试文章中描述的每种方法——也许我错过了什么? 如果您可以让这些REPL中的任何一个工作,我可能已经准备好了——但我更喜欢模块化的方法。谢谢你的帮助。 模块化为路线https://codepen.io/anon/pen/XGPKwZ?editors=0010 航线周围的集装箱https://