java实现n叉树数据结构
package maximumdepthnarytreenew;
import java.util.arraylist;
import java.util.linkedlist;
import java.util.queue;
// class representing node of n-ary tree
class node {
int val;
arraylist<node> children;
public node(int val) {
this.val = val;
this.children = new arraylist<>();
}
}
class numberofsiblingsofagivennodeinnarytree {
public static int maxdepth(node root) {
if (root == null)
return 0;
int max = 0;
for (node n : root.children) {
max = math.max(max, maxdepth(n));
}
return max + 1;
}
private static int siblings(node root, int target) {
// if the given node is equals to the root or root is null, return 0
if (root == null || root.val == target) {
return 0;
}
// create a queue of nodes
queue<node> queue = new linkedlist<>();
// push the root to queue
queue.add(root);
// do a bfs of the tree
while (!queue.isempty()) {
// remove one element from the queue
node curr = queue.poll();
// traverse its children
for (int i = 0; i < curr.children.size(); i++) {
// current child
node currchild = curr.children.get(i);
// if current child is the target, return (parent's children count - 1)
if (currchild.val == target) {
return (curr.children.size() - 1);
}
// add the child to the queue
queue.add(currchild);
}
}
// if there is no match, return -1
return -1;
}
public static void main(string[] args) {
// example n-ary tree
node root = new node(51);
// children of 51
root.children.add(new node(10));
root.children.add(new node(41));
root.children.add(new node(6));
root.children.add(new node(32));
// children of 10
root.children.get(0).children.add(new node(53));
// children of 41
root.children.get(1).children.add(new node(95));
// children of 6
root.children.get(2).children.add(new node(28));
// children of 32
root.children.get(3).children.add(new node(9));
root.children.get(3).children.add(new node(11));
// children of 53
root.children.get(0).children.get(0).children.add(new node(5));
root.children.get(0).children.get(0).children.add(new node(7));
// children of 11
root.children.get(3).children.get(1).children.add(new node(3));
root.children.get(3).children.get(1).children.add(new node(8));
system.out.println(siblings(root, 10));
system.out.println(siblings(root, 11));
system.out.println(maxdepth(root));
}
}n叉树的结点定义
n叉树

public class treenode{
public int data;
public treenode firstchild;
public treenode secondchild;
public treenode thirdchild;
...
...
}
由于并不是在所有的情况下都需要使用所有的指针,所以将导致大量的内存浪费,此外,另外一个问题是事先不知道节点个数
n叉树的表示
因为需要遍历树中的所有节点,所以一种可能的解决方法是:
1.同一个双亲节点(兄弟)孩子节点从左至右排列
2.双亲节点只能指向第一个孩子节点,删除从双亲节点到其他孩子节点的指针链接,
上述的具体含义是,如果孩子节点之间有一条链路相连,那么双亲节点就不需要额外的指针指向所有的孩子节点。这是因为从双亲节点的第一个孩子节点开始就能够遍历所有节点,因此,只要双亲节点用一个指针指向其第一个孩子节点,且同一个双亲节点的所有孩子之间都有链路,就可以解决上述问题
代码定义表示
public class treenode{
public int data;
public treenode firstchild;
public treenode nextsibling;
public int getdata(){
return data;
}
public void setdata(int data){
this.data = data;
}
public binarytreenode getfirstchild(){
return firstchild;
}
public void setfirstchild(binarytreenode firstchild){
this.firstchild = firstchild;
}
public binarytreenode getnextsibling(){
return nextsibling;
}
public void setnextsibling(binarytreenode nextsib ling){
this.nextsibling = nextsibling;
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论