namespace DSList
{
public class BinaryTree where T:IComparable
{
//Field
private TreeNode head;
//Property
public TreeNode Head
{
get
{
return head;
}
set
{
head = value;
}
}
//Constructors
public BinaryTree(T val, TreeNode lc, TreeNode rc)
{
TreeNode q = new TreeNode(val, lc, rc);
head = q;
}
public BinaryTree(T val)
{
TreeNode q = new TreeNode(val);
head = q;
}
public BinaryTree()
{
head = null;
}
//Base methods
public bool IsEmpty()
{
return head == null;
}
public TreeNode Root()
{
return head;
}
public TreeNode GetLChild(TreeNode p)
{
return p.LChild;
}
public TreeNode GetRChild(TreeNode p)
{
return p.RChild;
}
public void InsertL(T val,TreeNode p)
{
TreeNode q = new TreeNode(val);
q.LChild = p.LChild;
p.LChild = q;
}
public void InsertR(T val,TreeNode p)
{
TreeNode q = new TreeNode(val);
q.RChild = p.RChild;
p.RChild = q;
}
public TreeNode DeleteL(TreeNode p)
{
if (p == null || p.LChild == null)
{
return null;
}
TreeNode tmp = new TreeNode();
tmp = p.LChild;
p.LChild = null;
return tmp;
}
public TreeNode DeleteR(TreeNode p)
{
if (p == null || p.RChild == null)
{
return null;
}
TreeNode tmp = new TreeNode();
tmp = p.RChild;
p.RChild = null;
return tmp;
}
public bool IsLeaf(TreeNode p)
{
return p != null && p.LChild == null && p.RChild == null;
}
//DLR 前序遍历:Preorder traverse
public void PreOrder(TreeNode root)
{
if (root == null)
{
return;
}
Console.Write(root.Data);
PreOrder(root.LChild);
PreOrder(root.RChild);
}
//LDR 中序遍历
public void InOrder(TreeNode root)
{
if (root == null)
{
return;
}
InOrder(root.LChild);
Console.Write(root.Data);
InOrder(root.RChild);
}
//LRD 后序遍历
public void PostOrder(TreeNode root)
{
if (root == null)
{
return;
}
PostOrder(root.LChild);
PostOrder(root.RChild);
Console.Write(root.Data);
}
//广度优先遍历(层序遍历)
public void LevelOrder(TreeNode root)
{
if (root == null)
{
return;
}
CSeqQueue> sq = new CSeqQueue>();
sq.In(root);
while (!sq.IsEmpty())
{
TreeNode tmp = sq.Out();
Console.Write(tmp.Data);
if (tmp.LChild != null)
{
sq.In(tmp.LChild);
}
if (tmp.RChild != null)
{
sq.In(tmp.RChild);
}
}
}
public TreeNode Search(TreeNode root, T val)
{
if (root == null)
{
return null;
}
CSeqQueue> sq = new CSeqQueue>();
sq.In(root);
while (!sq.IsEmpty())
{
TreeNode tmp = sq.Out();
if (tmp.Data.Equals(val))
{
return tmp;
}
if (tmp.LChild != null)
{
sq.In(tmp.LChild);
}
if (tmp.RChild != null)
{
sq.In(tmp.RChild);
}
}
return null;
}
public int CountLeaf(TreeNode root)
{
TreeNode p = root;
if (p == null)
{
return 0;
}
else if (p.LChild == null && p.RChild == null)
{
return 1;
}
else
{
return CountLeaf(p.LChild) + CountLeaf(p.RChild);
}
}
public int GetDepth(TreeNode root)
{
int ld;
int rd;
if (root == null)
{
return 0;
}
else if (root.LChild == null && root.RChild == null)
{
return 1;
}
else
{
ld = GetDepth(root.LChild);
rd = GetDepth(root.RChild);
return (ld > rd ? ld : rd) + 1;
}
}
}
}