二叉樹的深度 寬度遍歷及平衡樹

2021-08-20 15:23:42 字數 3308 閱讀 4330

namespace val_tree

set

}public object data

set

}public node left //左孩子

set

}public node right //右孩子

set

}//構造方法

public node(object data)

public override string tostring()}}

using system;

using system.collections;

namespace val_tree

}//構造方法

public binarytree(string constructstr)

private void add(node parent, int index)

}int rightindex = 2 * index + 2;

if (rightindex < cstr.length)}}

public void preorder(node node) //先序遍歷

}public void midorder(node node) //中序遍歷

}public void afterorder(node node) //後繼遍歷

}public void levelorder() //寬度優先遍歷

if (node.right != null) //如果結點右孩子不為熔}}

}}

namespace val_tree

bool add(int value); //新增乙個元素

bool remove(int value);//刪除指定值

void removenode(node node);//刪除指定節點}}

using system;

using system.collections;

namespace val_tree

}public bool add(int value) //新增乙個元素

p = 0;

//prev為上一次訪問的結點,current為當前訪問結點

node prev = null, current = _head;

while (current != null)

prev = current;

//當插入值小於當前結點,則繼續訪問左子樹,否則訪問右子樹

current = (value < (int)prev.data) ? prev.left : prev.right;

}current = new node(value); //建立新結點

current.bf = 0;

if (value < (int)prev.data) //如果插入值小於雙親結點的值

else //如果插入值大於雙親結點的值

path[p] = current; //將新元素插入陣列path的最後

//修改插入點至根結點路徑上各結點的平衡因子

int bf = 0;

while (p > 0)

else if (bf == 2 || bf == -2) //需要旋轉的情況

}return true;

}//刪除指定值

public bool remove(int value)

if (value < (int)node.data)

else

}return false; //返回false表示刪除失敗

}//刪除指定結點

public void removenode(node node)

//用中序遍歷前驅結點的值代替被刪除結點的值

node.data = tmp.data;

if (path[p - 1] == node)

else

}else //當只有左子樹或右子樹或為葉子結點時

if (p > 0)

else

}else //當刪除的是根結點時

}//刪除完後進行旋轉,現在p指向實際被刪除的結點

int data = (int)node.data;

while (p > 0)}}

}//旋轉以root為根的子樹,當高度改變,則返回true;高度未變則返回false

private bool rotatesubtree(int bf)

else if (leftbf == 1)

else //當旋轉根左孩子的bf為0時,只有刪除時才會出現

}if (bf == -2) //當平衡因子為-2時需要進行旋轉操作

else if (rightbf == -1)

else //當旋轉根左孩子的bf為0時,只有刪除時才會出現

}//更改新的子樹根

if (p > 0)

else

}else

return tallchange;

}//root為旋轉根,rootprev為旋轉根雙親結點

private node ll(node root) //ll型旋轉,返回旋轉後的新子樹根

else 的情況,刪除時用

return rootnext; //rootnext為新子樹的根

}private node lr(node root) //lr型旋轉,返回旋轉後的新子樹根

newroot.bf = 0;

return newroot; //newroot為新子樹的根

}private node rr(node root) //rr型旋轉,返回旋轉後的新子樹根

else 的情況,刪除時用

return rootnext; //rootnext為新子樹的根

}private node rl(node root) //rl型旋轉,返回旋轉後的新子樹根

newroot.bf = 0;

return newroot; //newroot為新子樹的根

}public void levelorder() //寬度優先遍歷

if (node.right != null) //如果結點右孩子不為熔}}

二叉樹的深度 二叉樹的深度 二叉樹最大寬度

題目 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。例如 給定二叉樹 3,9,20,null,null,15,7 返回它的最大深度 3 根節點加上左右子樹的最大深度就是樹的最大深度。如下 class solution ...

二叉樹的深度,平衡二叉樹,二叉樹的映象

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。實現,遞迴遍歷二叉樹的左子樹,右子樹,取子樹深度大值,再加上子樹與根節點的距離1,即為這顆二叉樹的深度 classsolution 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。平...

二叉樹及二叉樹的遍歷

二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...