using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 二叉链表存储结构 { class BinaryTree<T> { private Node<T> head; public Node<T> Head { get { return this.head; } set { this.head = value; } } public BinaryTree() { this.head = null; } public BinaryTree(T t) { this.head = new Node<T>(t); } public BinaryTree(T t,Node<T> l,Node<T> r) { this.head = new Node<T>(t,l,r); } //空树的充要条件是head为null public bool IsEmpty { get { return this.head == null; } } //使用属性返回根节点 public Node<T> Root { get { return this.head; } } public Node<T> GetLeftNode(Node<T> n) { return n.LeftChild; } public Node<T> GetRightNode(Node<T> n) { return n.RightChild; } //将t插入结点n多左分支,原来的左节点成为t结点的左节点,注意: //第一个参数之所以为T而非Node,是要保证重新new一个结点,如果是Node的话,无法保证这个节点不在树上, //如果这个插入的结点在树上,则破坏了树的结构。使用参数T就可以避免,以为必须要new一个node public void InsertLeft(T t,Node<T> n) { Node<T> newNode = new Node<T>(t); newNode.LeftChild = n.LeftChild; n.LeftChild = newNode; } public void InsertRight(T t, Node<T> n) { Node<T> newNode = new Node<T>(t); newNode.RightChild = n.RightChild; n.RightChild = newNode; } //删除并返回左子树的根节点 public Node<T> RemoveLeftTree(Node<T> n) { if (n != null) { return null; } else { return n.LeftChild;//可以为null } } public Node<T> RemoveRightTree(Node<T> n) { if (n != null) { return null; } else { return n.LeftChild; } } //是否是叶子结点 public bool IsLeaf(Node<T> n) { return n != null && n.LeftChild == null && n.RightChild == null; } //先序遍历,深度优先的一种,参数为某结点,意思为遍历以该结点为根节点的树 public void TraverseDLR(Node<T> node) { //对node结点的操作 if (node != null) { Console.WriteLine(node.Value); this.TraverseDLR(node.LeftChild); this.TraverseDLR(node.RightChild); } else//递归结束的条件 { return; } } //中序深度优先 public void TraverseLDR(Node<T> node) { //对node结点的操作 if (node != null) { this.TraverseLDR(node.LeftChild); Console.WriteLine(node.Value); this.TraverseLDR(node.RightChild); } else//递归结束的条件 { return; } } //后序深度优先 public void TraverseLRD(Node<T> node) { //对node结点的操作 if (node != null) { this.TraverseLRD(node.LeftChild); this.TraverseLRD(node.RightChild); Console.WriteLine(node.Value); } else//递归结束的条件 { return; } } //层序遍历,广度优先 public void TraverseLevelOrder(Node<T> node) { if (node != null) { Queue<Node<T>> queue = new Queue<Node<T>>(); while (node != null) { Console.WriteLine(node.Value); if (node.LeftChild != null) { queue.Enqueue(node.LeftChild); } if (node.RightChild != null) { queue.Enqueue(node.RightChild); } if (queue.Count > 0)//必须判断,C#的队列当没有元素时,Dequeue动作要报错 { node = queue.Dequeue(); } else//Queue<>不能Dequeue一个null,因此需要自己设定,作为while结束的条件 { node = null; } } } else { return; } } } }